正则表达式捕获组多次和其他组

时间:2016-01-14 11:58:28

标签: regex pcre

我试图创建一个捕获多组数据的正则表达式。

以下是一些数据示例:

sampledata=X
B : xyz=1 FAB1_1=03 FAB2_1=01
A : xyz=1 FAB1_1=03 FAB2_1=01

我需要捕获应该出现一次的X,以及FAB1_1=03FAB2_1=01,...所有以FAB开头的字符串。

所以,我可以捕获所有" FAB"像这样:

/(FAB[0-9]_[0-9]=[0-9]*)/sg

但我无法使用此表达式包含X的捕获:

/sampledata=(?<samplegroup>[0-9A-Z]).*(FAB[0-9]_[0-9]=[0-9]*)/sg

此正则表达式仅返回一个X组和#34; FAB&#34;组的最后一个匹配。

1 个答案:

答案 0 :(得分:1)

您可以使用

(?:sampledata=(\S+)|(?!^)\G)(?:(?!FAB[0-9]_[0-9]=).)*(FAB[0-9]_[0-9])=([0-9]*)‌​

请参阅regex demo

正则表达式基于\G运算符,该运算符匹配字符串的开头或上一次成功匹配的结尾。我们将其限制为仅在后一种情况下与前瞻性(?!^)匹配。

所以:

  • (?:sampledata=(\S+)|(?!^)\G) - 匹配文字sampledata=,然后匹配并捕获到第1组中的一个或多个非空白符号-OR-匹配上一次成功匹配的结束
  • (?:(?!FAB[0-9]_[0-9]=).)* - 匹配任何非FABn_n=的文字(这是tempered greedy token
  • (FAB[0-9]_[0-9]) - 捕获第2组,匹配并捕获FAB,后跟数字,然后是_,还有一个数字
  • = - 文字=
  • ([0-9]*)‌​ - 捕获第3组,匹配并捕获零个或多个数字

如果你有1 sampledata=阻止,你可以安全地展开调和的贪婪代币(demo

(?:sampledata=(\S+)|(?!^)\G)[^F]*(?:F(?!FAB[0-9]_[0-9]=)[^F]*)*?(FAB[0-9]_[0-9])=([0-9]*)
                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

这样,表达式会更有效率。

如果您有多个sampledata阻止,请增强缓和的贪婪令牌:

(?:sampledata=(\S+)|(?!^)\G)(?:(?!sampledata=|FAB[0-9]_[0-9]=).)*(FAB[0-9]_[0-9])=([0-9]*)

请参阅another demo