sed到php preg_match正则表达式

sed to php preg_match regex

我有这个字符串:

1
2
3
$str ="Samples read:           2748264
        Length (seconds):     31.159456
        Scaled by:         2147483647.0"
;

在命令行上,如果我想在"长度(秒)"之后提取值:我可以像这样使用sed:

1
sed -n 's#^Length (seconds):[^0-9]*\\([0-9.]*\\)$#\\1#p'

如何将其重新格式化为php \\的正则表达式匹配格式?我只需要长度(秒)之后的数字即可:(如果存在)。


1
2
    preg_match('/Length \\(seconds\\):\\s+(.*?)Scale/is', $str,$m);
    echo $m[1];


sed使用regex的一些奇怪的(旧的?)变体,并且它需要转义括号以创建组,并使其不转义以按字面意义进行解释。

preg_match()使用Perl-Compatible Regular Expressions

您需要更改的内容:

  • 反转括号的转义;
  • 用您要匹配的组中的点(.)引号(否则它将匹配任何字符);我认为它也应该用sed引用;
  • 更改^$锚点以匹配输入文本(在行的开头具有空格字符),或确保要匹配的字符串(Length)始终出现在行的开头在输入文本中(无填充);我在行的开头添加了一个非捕获组((?:\\s*))来匹配零个或多个空格字符;
  • 添加m修饰符(multi-line),以允许^$在行的开头和结尾匹配;没有它,它们仅匹配输入字符串的开头和结尾。

代码:

1
2
3
4
5
6
7
8
$str ="Samples read:           2748264
        Length (seconds):     31.159456
        Scaled by:         2147483647.0"
;

$matches = array();
if (preg_match_all('#^(?:\\s*)Length \\(seconds\\):[^0-9]*([0-9\\.]*)$#m', $str, $matches)) {
    var_dump($matches[1]);
}

输出为:

1
2
3
4
Array
(
    [0] => 31.159456
)

如果知道要匹配的字符串在输入字符串中仅出现一次(或者如果仅想匹配其首次出现),则可以使用preg_match()代替preg_match_all(),它将在其中存储一个字符串$matches[1](如果找到匹配项)。