正则表达式匹配前两个单词并排除

Regex matching in first two words with exclusion

我在满足以下对单个表达式的要求时遇到了一些困难。为了简单起见,它被分解了。

  1. 匹配前两个词

  2. 用结果A,匹配特定的字符串列表X、Y、Z

  3. 除非任何一个A包含W

到目前为止,以下内容似乎无法满足要求 1-2。

(?([?=^\s]+\s+[^\s]+|[^\s]+)(stringX|stringY))

如有任何提示,我们将不胜感激。真的可以吗?

编辑 - 匹配示例:

"Bob teststringX jack John"
"anotherstringY jack john"

不应该匹配:

"Bob jack teststringY john"
"Jim teststringY John jack" (if W=Jim)

谢谢

m/^\w*Jim\K|^\w+\W+\w*Jim\K|^(\w*(?:stringX|stringY)\w*)\W+(\w+)|^(\w+)\W+(\w*(?:stringX|stringY)\w*)/gm

让我们分解一下:

m/pattern/gm 匹配 pattern g 局部(找到所有匹配项),也在 m多行模式(^和$匹配行的开始和结束,除了多行字符串的开始和结束)。

^\w*Jim\K|var1 该行是否以包含 Jim 的单词开头?如果是,则 \K 从字符串中的当前位置开始匹配。随后,模式将不匹配,因为所有备选方案都锚定在带有 ^ 的行的开头。匹配结束,你还没有捕获到任何东西。如果不是,请转到 var1:

^\w+\W+\w*Jim\K|var2 该行的第二个单词是否包含 Jim?如果是,则 \K 从字符串中的当前位置开始匹配。随后,模式将不匹配,因为所有备选方案都锚定在带有 ^ 的行的开头。匹配结束,你还没有捕获到任何东西。如果不是,请转到 var2:

^(\w*(?:stringX|stringY)\w*)\W(\w+)|var3 查找一行的开头,然后是 0 个或多个单词字符(以防第一个单词以或不以您的一个匹配字符串开头),然后是您的一个匹配字符串,然后0 个或多个单词字符(以防第一个单词以或不以您的匹配字符串之一结尾)。然后,寻找一个非单词字符,然后是 1 个或多个单词字符。忽略行中接下来可能出现的任何其他内容。

如果匹配,则两个词都被捕获。如果这不匹配,请尝试 var3:

^(\w+)\W(\w*(?:stringX|stringY)\w*) 查找一行的开头,然后是 1 个或多个单词字符,然后是一个非单词字符,然后是 0 个或多个单词字符,然后是您的匹配字符串之一,然后是 0 个或多个单词字符。

如果匹配,则两个词都被捕获。如果这不匹配,则该行不符合您的条件。

注意,但是,如果您的目的只是捕获与您的匹配字符串之一匹配的前两个单词的子字符串,而不是包含它的整个单词,您可以移动前后 \w*s

内的捕获括号