我正在尝试匹配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可以很好地解释消极的前瞻,但不幸的是我找不到合适的组合。
我错过了一些明显的东西吗?
答案 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
您正在寻找字符串$
的结尾参考: