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

Regex 正则表达式多次捕获组和其他组,regex,pcre,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=03,FAB2_1=01。。。以FAB开头的所有字符串 所以,我可以像这样捕捉所有的“晶圆厂”: /(FAB[0-9]_[0-9]=[0-9]*)/sg 但我无法使用以下表达式包含对X的捕获: /sampledata=(?<sam

我正在尝试创建一个正则表达式,它捕获多组数据

以下是一些数据示例:

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[0-9]_[0-9]=[0-9]*)/sg
但我无法使用以下表达式包含对
X
的捕获:

/sampledata=(?<samplegroup>[0-9A-Z]).*(FAB[0-9]_[0-9]=[0-9]*)/sg
/sampledata=(?[0-9A-Z]).*(FAB[0-9].[0-9]=[0-9]*)/sg
此正则表达式只返回一个带有
X
的组和最后一个匹配的“FAB”组。

您可以使用

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

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

因此:

  • (?:sampledata=(\S+)|(?!^)\G)
    -匹配一个文本
    sampledata=
    ,然后匹配一个或多个非空白符号并将其捕获到组1中-或-匹配上一次成功匹配的结尾
  • (?:(?!FAB[0-9].[0-9]=)*
    -匹配任何不是
    FABn\u n=
    的文本(这是一个)
  • (FAB[0-9]\uU[0-9])
    -捕获组2,匹配并捕获
    FAB
    ,后跟一个数字,然后是一个
    \uU
    ,还有一个数字
  • =
    -文字
    =
  • ([0-9]*)‌​-捕获组3,匹配并捕获零或多个数字
如果您有1个
sampledata=
block
,您可以安全地展开令牌(),如下所示:

这样,表达式将更加有效

如果您有多个
sampledata
,请增强令牌:

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

看到了吗?@Stribizev是的,没错!谢谢,我不太理解你的表达式,但它正在工作。请注意:展开的正则表达式模式不需要
/s
修饰符,但它需要修饰符。
(?:sampledata=(\S+)|(?!^)\G)(?:(?!sampledata=|FAB[0-9]_[0-9]=).)*(FAB[0-9]_[0-9])=([0-9]*)