【问题标题】:Cannot get Negative Lookahead regexp to properly match无法使负前瞻正则表达式正确匹配
【发布时间】:2013-10-28 19:16:08
【问题描述】:

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

我是否遗漏了一些明显的东西?

【问题讨论】:

  • 你的模式说,“如果你能找到 any 非空的字符序列,并且没有紧跟 .jsp 或 .jspx,那么它就是匹配的。”所以它当然会匹配some/path/to/file.jsp,因为它可以匹配sso,或者只要它不包含最后一个斜线就可以了。见阿努巴瓦的回答。如果字符串的开头后跟一个非空字符序列,然后是.jsp[x](如果.jsp[x] 在字符串的末尾),则第二个使用负前瞻失败。

标签: java regex regex-negation regex-lookarounds


【解决方案1】:

您可以将negative lookbehind 用作:

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

或者你可以使用negative lookahead作为:

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

【讨论】:

  • 感谢您的回答。不幸的是,我不明白这两种模式是如何工作的。您能否就这些模式如何匹配提供一些解释?我从来没有能够正确掌握前瞻或后瞻exoresions的构造。
  • @EricB.:有关外观的最佳解释,请访问这个简单的文档:regular-expressions.info/lookaround.html
  • 如果您对我的回答感到满意,请考虑将其标记为“已接受”,以便以后遇到类似问题的用户能够轻松看到。
【解决方案2】:

这是另一个负面的回顾:

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

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

你正在寻找字符串 $ 的结尾

参考:

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

Regex not ending with

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 2011-10-14
    • 2010-12-17
    • 1970-01-01
    相关资源
    最近更新 更多