正则表达式Lookahead和Lookbehinds:接着是这个或那个

时间:2013-05-30 15:43:41

标签: java regex regex-lookarounds

我正在尝试编写一个正则表达式,提前检查以确保在我搜索的单词之后有空白字符或开括号。 此外,我希望它回顾并确保它前面有非Word(\W)或者根本没有(即它是语句的开头)。

到目前为止,我有,

"(\\W?)(" + words.toString() + ")(\\s | \\()"

然而,这也匹配两端的东西 - 我希望这个模式只匹配单词本身 - 而不是它周围的东西。

我正在使用Java flavor Regex。

3 个答案:

答案 0 :(得分:2)

当您自己标记问题时,需要lookarounds

String regex = "(?<=\\W|^)(" + Pattern.quote(words.toString()) + ")(?= |[(])"
  • (?<=X)表示“以X开头”
  • (?<!=X)表示前面有X”
  • (?=X)表示“后跟X”
  • (?!=X)表示后跟X”

答案 1 :(得分:1)

这个词本身怎么样:它总是以一个单词字符开头(即一个匹配\w的字符)?如果是这样,您可以使用单词边界作为主要条件。

"\\b" + theWord + "(?=[\\s(])"

否则,你可以使用负面的lookbehind:

"(?<!\\w)" + theWord + "(?=[\\s(])"

我假设这个词的引用是这样的:

String theWord = Pattern.quote(words.toString());

......或者不需要。

答案 2 :(得分:0)

如果您不希望匹配捕获组,则可以使用特殊构造(?:X)

所以,在你的情况下:

"(?:\\W?)(" + words.toString() + ")(?:\\s | \\()"

您将只有两个小组,group(0)代表整个字符串,group(1)代表您要查找的字词。