我在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% /
谁能告诉我这里缺少什么?为什么这不起作用?我把问题缩小到了正则表达式中。
答案 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\/]+)$/");
我还将[0-9]
替换为\d
。
如果您想放弃数字匹配并只保留指定的捕获组......
$matches = array_diff_key($matches, array_values($matches));