我对单个表达式的以下要求有些困难。为简单起见,它被打破了。
匹配前两个单词
使用结果A,匹配特定的字符串列表X,Y,Z
除非任何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)
由于
答案 0 :(得分:1)
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
匹配模式 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*)
查找一行的开头,然后是一个或多个单词字符,然后是一个非单词字符,然后是0个或多个单词字符,然后是一个匹配字符串,然后是0个或多个单词字符。
如果匹配,则捕获两个单词。如果这不匹配,则该行不符合您的条件。
注意,但是,如果您的目的只是捕获匹配其中一个匹配字符串的前两个单词的子字符串,而不是包含它的整个单词,则可以移动捕获括号在前面和后面的\w*
s