-1

我有一个包含多个表的文本文件,如下所示:

_____________________________________
Heading 1       | Heading 2
_______________ | ___________________
Label1 18857.10 | Label3 710.00
Label2 2361.50  | Label4 0.00
                | Label5 2531.37
                | Label6 0.00
                | Label7 0.00
                | Label8 0.01
________________| ___________________
       16495.60 | Label9 3969.06
_______________ | ___________________

我想使用正则表达式将数值存储到变量中。由于我是正则表达式的新手,所以我找不到办法。谁能帮我这个?

4

1 回答 1

1
$table="_____________________________________
Heading 1       | Heading 2
_______________ | ___________________
Label1 18857.10 | Label3 710.00
Label2 2361.50  | Label4 0.00
                | Label5 2531.37
                | Label6 0.00
                | Label7 0.00
                | Label8 0.01
________________| ___________________
       16495.60 | Label9 3969.06
_______________ | ___________________
";

$num = preg_match_all('/(\w+) (\d+(\.\d+)?)/', $table, $result);


for($i=0; $i<$num; $i++){
  echo "{$result[1][$i]} = {$result[2][$i]}<br>";
}

如果您的桌子与您展示的完全一样,则此方法有效。

正则表达式:/(\w+) (\d+(\.\d+)?)/

开头和结尾的斜线/用于分隔正则表达式。

(\w+)意思是“匹配任何字母、数字或下划线一次或多次

后跟一个空格,您可以在空格后添加 + 以匹配多个,或者将 \s 代替空格以匹配任何白色字符,例如制表符..

(\d+(\.\d+)?)... \d+表示一位或多位数字,(\.\d+)表示点后跟一位或多位数字,问号表示前面的括号(\.\d+)是可选的。

Preg_match_all 将这些匹配存储在第三个参数中并返回匹配数。in$result[$i][0]是整个匹配,$result[$i][1]是第一个子表达式(\w+)$result[$i][2]是第二个括号(\d+(\.\d+)?)$result[$i][3]是小数部分(\.\d+),它在里面$result[$i][2],但你不需要$result[$i][3],只是为了解释:)

代码打印:

Heading = 1
Heading = 2
Label1 = 18857.10
Label3 = 710.00
Label2 = 2361.50
Label4 = 0.00
Label5 = 2531.37
Label6 = 0.00
Label7 = 0.00
Label8 = 0.01
Label9 = 3969.06

编辑:对不起,它不起作用,它与那个裸 16495.60 值不匹配。让我再想一想……

...

$regex='/([a-zA-Z0-9]+)? +(\d+(\.\d+)?)/';

更好一点,这是它的工作原理:

  • [a-zA-Z0-9]+匹配非零数量的字母或数字
  • ?括号表示后,整个括号表达式是可选的。
  • +一个或多个空格
  • (\d+(\.\d+)?)非零位数后跟可选的{点和另一个非零位数}

整个正则表达式不包含|或换行,因此所有匹配都应仅发生在表的一个字段中。

结果变量应该是:

array (size=4)
  0 => 
    array (size=12)
      0 => string 'Heading 1' (length=9)
      1 => string 'Heading 2' (length=9)
      2 => string 'Label1 18857.10' (length=15)
      3 => string 'Label3 710.00' (length=13)
      4 => string 'Label2 2361.50' (length=14)
      5 => string 'Label4 0.00' (length=11)
      6 => string 'Label5 2531.37' (length=14)
      7 => string 'Label6 0.00' (length=11)
      8 => string 'Label7 0.00' (length=11)
      9 => string 'Label8 0.01' (length=11)
      10 => string '           16495.60' (length=19)
      11 => string 'Label9 3969.06' (length=14)
  1 => 
    array (size=12)
      0 => string 'Heading' (length=7)
      1 => string 'Heading' (length=7)
      2 => string 'Label1' (length=6)
      3 => string 'Label3' (length=6)
      4 => string 'Label2' (length=6)
      5 => string 'Label4' (length=6)
      6 => string 'Label5' (length=6)
      7 => string 'Label6' (length=6)
      8 => string 'Label7' (length=6)
      9 => string 'Label8' (length=6)
      10 => string '' (length=0)
      11 => string 'Label9' (length=6)
  2 => 
    array (size=12)
      0 => string '1' (length=1)
      1 => string '2' (length=1)
      2 => string '18857.10' (length=8)
      3 => string '710.00' (length=6)
      4 => string '2361.50' (length=7)
      5 => string '0.00' (length=4)
      6 => string '2531.37' (length=7)
      7 => string '0.00' (length=4)
      8 => string '0.00' (length=4)
      9 => string '0.01' (length=4)
      10 => string '16495.60' (length=8)
      11 => string '3969.06' (length=7)
  3 => 
    array (size=12)
      0 => string '' (length=0)
      1 => string '' (length=0)
      2 => string '.10' (length=3)
      3 => string '.00' (length=3)
      4 => string '.50' (length=3)
      5 => string '.00' (length=3)
      6 => string '.37' (length=3)
      7 => string '.00' (length=3)
      8 => string '.00' (length=3)
      9 => string '.01' (length=3)
      10 => string '.60' (length=3)
      11 => string '.06' (length=3)

编辑2:再次抓住那些片段!点之前应该有一个反斜杠,在(\.\d+)!!! 我格式错误,它消失了。**重写它,现在应该没问题。

于 2013-01-06T06:52:41.730 回答