正则表达式重复组忽略字符串

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

这将匹配两次,

  1. ['0:4', '0:0', 'copy']
  2. ['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