1

在文本文件中,我有以下字符串:

 ID  |      LABEL       | A |   B  | C
--------------------------------------
9999 | Oxygen Isotopes  |   | 0.15 | 1 
8733 | Enriched Uranium |   | 1    | 1 

我想使用正则表达式提取字段ID和每一行。LABEL

我怎样才能实现它?

4

7 回答 7

2

我不确定你为什么坚持使用正则表达式。

由于该列似乎由 | 分隔 符号,似乎使用 PHP 函数explode会是一个更简单的解决方案。

您将能够遍历这些行,并使用典型的数组索引表示法来引用每一列,例如:$line[0]分别$line[1]用于 ID 和 LABEL。

于 2012-11-10T22:14:49.160 回答
1

您可以preg_split在每一行上使用:

$array = preg_split(`/\s*\|\s*/`, $inputLine, 2);

然后就像在 djdy 的回答中一样,ID 将在$array[0]并且标签在$array[1].

于 2012-11-10T22:15:15.097 回答
1

不需要正则表达式:

<?php
$file = file('file.txt');

$ret = array();
foreach($file as $k=>$line){
    if($k<2){continue;}

    list($ret['ID'][],
         $ret['LABEL'][],
         $ret['A'][],
         $ret['B'][],
         $ret['C'][]) = explode('|',$line);
}

print_r($ret);

//Label: Oxygen Isotopes ID:9999 
echo 'Label: '.$ret['LABEL'][0].' ID:'.$ret['ID'][0];

/*
Array
(
    [C] => Array
        (
            [0] =>  1 

            [1] =>  1 
        )

    [B] => Array
        (
            [0] =>  0.15 
            [1] =>  1    
        )

    [A] => Array
        (
            [0] =>    
            [1] =>    
        )

    [LABEL] => Array
        (
            [0] =>  Oxygen Isotopes  
            [1] =>  Enriched Uranium 
        )

    [ID] => Array
        (
            [0] => 9999 
            [1] => 8733 
        )

)
*/
?>
于 2012-11-10T22:20:43.073 回答
1

我怀疑正则表达式是这里最好的解决方案。

试试这个将文本文件分成一组行(这可能会或可能不会起作用,具体取决于您在其上创建 txt 文件的机器的操作系统)

$lines = explode($text, "\n");
$final_lines = array();

foreach ($lines as $line) {
    $parts = explode($line, " | ");
    $final_lines[] = $parts;
}

现在您可以通过行号和列访问所有数据,例如

$final_lines[2][0]

将包含 8733。

于 2012-11-10T22:23:15.687 回答
0

正则表达式可能不是这里最好的方法。我会在每一行中读取一个字符串,并使用 String.explode("|", input) 创建一个字符串数组。0 索引是您的 ID,1 索引是您的标签,如果您愿意,A、B 和 C 依此类推。这是一个比使用正则表达式更强大的解决方案。

获取 ID 的正则表达式可能类似于

\d{4}  |

您可以为标签字段做类似的事情,再次出现错误,这不像使用爆炸那么健壮。

于 2012-11-10T22:16:00.597 回答
0

尝试

$str = file_get_contents($filename);
preg_match_all('/^\s*(\d*)\s*\|\s*(.*?)\s*\|/m', $str, $matches);
// $matches[1] will have ids
// $matches[2] will have labels 
于 2012-11-10T22:20:22.430 回答
0

虽然它不是在这里使用正则表达式的最佳方法,但可能是这样的

preg_match_all("/(\d{4}.?)\|(.*?)\|/s", $data, $matchs)

will 的第二个和第三个索引$matches携带所需的数据

于 2012-11-10T22:23:55.103 回答