正则表达式重复组忽略字符串
Regex repeat group ignoring strings
我做了一些研究,但对我的情况没有任何帮助。
我有这个正则表达式,我可以在其中获取 Stream # 0:4,但我想重复该规则并捕获 Stream # 0:5。我如何重复规则并在中间忽略 -> # 0: 0 (copy) -> # 0: 1 (copy)
正则表达式
/(?<=Stream mapping:)(\s+)([a-zA-Z])+(\s+)#([0-9]:[0-9])/s
文字
Metadata:
variant_bitrate : 800000
Stream mapping:
Stream #0:4 -> #0:0 (copy)
Stream #0:5 -> #0:1 (copy)
Press [q] to stop, [?] for help
我目前的成绩
array(1) {
[0]=> array(5)
{
[0]=> string(15) " Stream #0:4"
[1]=> string(4) " "
[2]=> string(1) "m"
[3]=> string(1) " "
[4]=> string(3) "0:4" }
}
另一个问题是我的正则表达式将 "m" 视为单独的组合并包含空格。我该如何解决这个问题?
我想要一个像
这样的最终结果
[0]Stream #0:4
[1]Stream #0:5
为什么不干脆
/^ Stream #([\d:]+) -> #([\d:]+) \((.*)\)/gm
这将匹配两次,
['0:4', '0:0', 'copy']
和
['0:5', '0:1', 'copy']
你对 (?<=Stream mapping:)
的回顾是破坏你方法的原因。我不认为这个输入真的需要它。
请注意,使用 m
标志,^
匹配每一行,这在这里很有用。
您可以使用基于 \G
运算符的自定义词边界:
$re = '/(?:\G(?!^)\s*|Stream mapping:\s*)\K([a-zA-Z]+\s+#[0-9]+:[0-9]+).*/';
$str = 'Metadata:
variant_bitrate : 800000
Stream mapping:
Stream #0:4 -> #0:0 (copy)
Stream #0:5 -> #0:1 (copy)
Press [q] to stop, [?] for help';
if (preg_match_all($re, $str, $m)) {
print_r($m[1]);
}
参见PHP demo。
图案详情:
(?:\G(?!^)\s*|Stream mapping:\s*)
- 上一个匹配项的结尾和 0+ 个空格字符或 Stream mapping:
子字符串后跟 0+ 个空格
\K
- 匹配重置运算符丢弃当前匹配的文本
([a-zA-Z]+\s+#[0-9]+:[0-9]+)
- 第 1 组:1+ 个字母,1+ 个空格,#
,1+ 位数字,:
,1+ 位数字
.*
- 到行尾的任何 0+ 个字符(必须使用,因为我们需要连续匹配)
参见regex demo。
我做了一些研究,但对我的情况没有任何帮助。
我有这个正则表达式,我可以在其中获取 Stream # 0:4,但我想重复该规则并捕获 Stream # 0:5。我如何重复规则并在中间忽略 -> # 0: 0 (copy) -> # 0: 1 (copy)
正则表达式
/(?<=Stream mapping:)(\s+)([a-zA-Z])+(\s+)#([0-9]:[0-9])/s
文字
Metadata:
variant_bitrate : 800000
Stream mapping:
Stream #0:4 -> #0:0 (copy)
Stream #0:5 -> #0:1 (copy)
Press [q] to stop, [?] for help
我目前的成绩
array(1) {
[0]=> array(5)
{
[0]=> string(15) " Stream #0:4"
[1]=> string(4) " "
[2]=> string(1) "m"
[3]=> string(1) " "
[4]=> string(3) "0:4" }
}
另一个问题是我的正则表达式将 "m" 视为单独的组合并包含空格。我该如何解决这个问题?
我想要一个像
这样的最终结果[0]Stream #0:4
[1]Stream #0:5
为什么不干脆
/^ Stream #([\d:]+) -> #([\d:]+) \((.*)\)/gm
这将匹配两次,
['0:4', '0:0', 'copy']
和['0:5', '0:1', 'copy']
你对 (?<=Stream mapping:)
的回顾是破坏你方法的原因。我不认为这个输入真的需要它。
请注意,使用 m
标志,^
匹配每一行,这在这里很有用。
您可以使用基于 \G
运算符的自定义词边界:
$re = '/(?:\G(?!^)\s*|Stream mapping:\s*)\K([a-zA-Z]+\s+#[0-9]+:[0-9]+).*/';
$str = 'Metadata:
variant_bitrate : 800000
Stream mapping:
Stream #0:4 -> #0:0 (copy)
Stream #0:5 -> #0:1 (copy)
Press [q] to stop, [?] for help';
if (preg_match_all($re, $str, $m)) {
print_r($m[1]);
}
参见PHP demo。
图案详情:
(?:\G(?!^)\s*|Stream mapping:\s*)
- 上一个匹配项的结尾和 0+ 个空格字符或Stream mapping:
子字符串后跟 0+ 个空格\K
- 匹配重置运算符丢弃当前匹配的文本([a-zA-Z]+\s+#[0-9]+:[0-9]+)
- 第 1 组:1+ 个字母,1+ 个空格,#
,1+ 位数字,:
,1+ 位数字.*
- 到行尾的任何 0+ 个字符(必须使用,因为我们需要连续匹配)
参见regex demo。