sed 到 php preg_match 正则表达式

sed to php preg_match regex

我有这个字符串:

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

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

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

如何将其重新格式化为 php 的正则表达式匹配格式?我只需要 Length (seconds): 之后的数字,如果它存在的话。

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

sed 使用了 regex 的一些奇怪的(旧的?)变体,它需要转义括号以创建一个组并让它们不转义以从字面上解释它们。

preg_match() uses Perl-Compatible Regular Expressions.

您需要更改的内容:

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

代码:

$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]);
}

输出为:

Array
(
    [0] => 31.159456
)

如果您知道要匹配的字符串在输入字符串中只出现一次(或者如果您只想匹配它的第一次出现),那么您可以使用 preg_match() instead of preg_match_all() 并将字符串存储在 $matches[1](如果找到匹配项)。