无法获得Negative Lookahead正则表达式以正确匹配

时间:2013-10-28 19:16:08

标签: java regex regex-negation regex-lookarounds

我正在尝试匹配Java中没有.jsp / .jspx扩展名的字符串,并且使用负前瞻模式会遇到很多困难。

给出一堆字符串:

String string1 = "templateName";
String string2 = "some/path"
String string3 = "basic/filename/no/extension"
String string4 = "some/path/to/file.jsp"
String string5 = "alternative/path/to/file.jspx"

我正在尝试找到一个匹配前3个而不是最后2个的正则表达式。

我原本以为带有负前瞻的正则表达式会起作用。

例如:

Pattern p = new Pattern.compile( "(.+)(?!\\.jsp[x]?)")

但是这种模式似乎与上述所有字符串相匹配。我最初认为第1组可能太贪心,所以我尝试过(。+?),但这也无济于事。

这个SO Post可以很好地解释消极的前瞻,但不幸的是我找不到合适的组合。

我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:2)

您可以将negative lookbehind用作:

Pattern p = new Pattern.compile( "^(.+)(?<!\\.jspx?)$" );

或者您可以将negative lookahead用作:

Pattern p = new Pattern.compile( "^(?!.+?\\.jspx?$)(.+)$" );

答案 1 :(得分:1)

这是另一个负面的背后隐藏:

Pattern p = new Pattern.compile(".*(?<!.jspx?)$");

(?<!.jspx?)是一个否定的lookbehind断言,这意味着在字符串结束之前,没有.jsp或.jspx

您正在寻找字符串$

的结尾

参考:

http://www.regular-expressions.info/lookaround.html

Regex not ending with