df输出上的正则表达式无法正常工作

时间:2012-02-13 03:44:57

标签: php regex

我在PHP中使用以下正则表达式和preg_match函数来匹配Linux中 df 命令的输出。请注意,我使用define宏来简化正则表达式的可读性。

define("MATCH_DF",
    "/^(?P<filesystem>[0-9a-z\/]+)\s+" . 
    "(?P<blocks>[0-9]+)\s+" . 
    "(?P<used>[0-9]+)\s+" . 
    "(?P<avail>[0-9]+)\s+" . 
    "(?P<percent>[0-9]+%)\s+" .
    "(?P<mount>[0-9a-zA-Z\/]+)\s+$/");

对于那些不知道的人,df命令行的输出看起来像这样......

Filesystem       1K-blocks      Used Available Use% Mounted on
/dev/sda2        236520176   2863468 221642116   2% /

谁能告诉我这里缺少什么?为什么这不起作用?我把问题缩小到了正则表达式中。

1 个答案:

答案 0 :(得分:4)

你正在寻找字符串末尾的一些空格,其中没有任何空格。您可以将+量词替换为*以使其成为可选项,或者将其全部删除。

试试这个正则表达式......

define("MATCH_DF",
    "/^(?P<filesystem>[\da-z\/]+)\s+" . 
    "(?P<blocks>\d+)\s+" . 
    "(?P<used>\d+)\s+" . 
    "(?P<avail>\d+)\s+" . 
    "(?P<percent>\d+%)\s+" .
    "(?P<mount>[\da-zA-Z\/]+)$/");

CodePad

我还将[0-9]替换为\d

如果您想放弃数字匹配并只保留指定的捕获组......

$matches = array_diff_key($matches, array_values($matches));

CodePad