我试图创建一个捕获多组数据的正则表达式。
以下是一些数据示例:
sampledata=X
B : xyz=1 FAB1_1=03 FAB2_1=01
A : xyz=1 FAB1_1=03 FAB2_1=01
我需要捕获应该出现一次的X
,以及FAB1_1=03
,FAB2_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;组的最后一个匹配。
答案 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