0

我正在尝试匹配在 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很好地解释了负面的前瞻性,但不幸的是它并没有帮助我找到正确的组合。

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

4

2 回答 2

2

您可以negative lookbehind用作:

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

或者您可以negative lookahead用作:

Pattern p = new Pattern.compile( "^(?!.+?\\.jspx?$)(.+)$" );
于 2013-10-28T19:20:16.000 回答
1

这是另一个负面的回顾:

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

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

您正在查看字符串 $ 的末尾

参考:

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

正则表达式不以

于 2013-10-29T05:45:17.147 回答