更优雅的REGEX?可能正/负前瞻/落后?

时间:2018-08-17 08:45:57

标签: regex preg-match

我这里有一个正则表达式,可以产生想要的效果,但是有点笨拙

https://regex101.com/r/WwxW6G/2

\(.*?, USA\)|\(USA, .*?\)|\(.*?, USA, .*?\)

输入:

Match Me! (USA, Europe)
Match Me! (Europe, USA)
Match Me! (Asia, USA, Europe)

Don't Match Me (USA)
Don't Match Me USA
USA Don't Match Me
Don't Match Me (USA)

我想知道是否有一种方法可以在没有几个OR的情况下进行操作-我不需要一个干净的括号来匹配,我只需要在检查中匹配正确的行即可。

非常感谢!

3 个答案:

答案 0 :(得分:0)

在括号之间使用单个替换来检查美国前后的逗号,您可以使用:

\(.*?(?:\bUSA\s*,|,\s*USA\b).*?\)

答案 1 :(得分:0)

在这种情况下-当一个单词可以定界并且一个定界符是必须的,并且该单词的长度已知时-您可以从两种积极的观察中受益:

\([^)]*?USA(?:(?=,)|(?<=, ...))[^)]*\)

请参见live demo here

这将导致更快速的匹配。

答案 2 :(得分:0)

编辑并不是那么优雅,但我认为它是完整的:S。

我要去;)

\((?=[^,)]*,)(?=(?:[^)]*, )?\bUSA\b(?=,|\)))(?:\w+,?\s*)+\)

它使用正向前行来确保括号内有逗号(因此至少是两个词)以及USA一词(因为我猜想这是一个要求-Q中未说明)。然后,它仅允许在括号内使用任意数量的逗号分隔的单词。

Here at regex101