首页 > 解决方案 > 正则表达式重复组忽略字符串

问题描述

我做了一些研究,但对我的情况没有任何帮助。

我有这个正则表达式,我可以在其中获得 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

标签: phpregexpreg-match

解决方案


您可以使用基于\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 演示

图案细节:

  • (?:\G(?!^)\s*|Stream mapping:\s*)- 前一个匹配的结尾和 0+ 个空格字符或Stream mapping:子字符串后跟 0+ 个空格
  • \K- 匹配重置运算符丢弃当前匹配的文本
  • ([a-zA-Z]+\s+#[0-9]+:[0-9]+)- 第 1 组:1+ 字母、1+ 空格、#、1+ 数字、:、1+ 数字
  • .*- 任何 0+ 字符到行尾(必须使用它,因为我们需要连续匹配)

请参阅正则表达式演示


推荐阅读