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

时间:2018-05-21 06:10:38

标签: php regex preg-match

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

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

另一个问题是我的正则表达式正在治疗&#34; m&#34;作为单独的组合,包括空格。我该如何解决这个问题?

我想要一个像

这样的最终结果
[0]Stream #0:4
[1]Stream #0:5

2 个答案:

答案 0 :(得分:1)

您可以使用基于\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 +位数,:,1 +位数
  • .* - 行末尾的任何0 +字符(必须使用它,因为我们需要连续匹配)

请参阅regex demo

答案 1 :(得分:0)

为什么不简单

['0:4', '0:0', 'copy']

将匹配两次,

  1. ['0:5', '0:1', 'copy']
  2. (?<=Stream mapping:)
  3. 你对m的支持是破坏你的方法的原因。我不认为这个输入真的需要它。

    请注意,使用^标记,print("{0:^40}".format(data_list[0])) for i in range(1,len(data_list), 2): name1 = data_list[i] name2 = data_list[i+1] print("{0:<20}{1:>20}\n".format(name1, name2)) 匹配每行,这在此处很有用。