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]
(如果找到匹配项)。
我有这个字符串:
$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]
(如果找到匹配项)。