Java 正则表达式:否定的 lookahead

我正在尝试制作两个与URI匹配的正则表达式。这些 URI 的格式为:和/foo/someVariableData/foo/someVariableData/bar/someOtherVariableData

我需要两个正则表达式。每个都需要匹配一个,但不能匹配另一个。

我最初想到的正则表达式分别是:和。/foo/.+/foo/.+/bar/.+

我认为第二个正则表达式很好。它只会匹配第二个字符串。但是,第一个正则表达式同时匹配两者。所以,我开始(第一次)带着负面的眼光玩弄。我设计了正则表达式并设置了以下代码来测试它/foo/.+(?!bar)

public static void main(String[] args) {
    String shouldWork = "/foo/abc123doremi";
    String shouldntWork = "/foo/abc123doremi/bar/def456fasola";
    String regex = "/foo/.+(?!bar)";
    System.out.println("ShouldWork: " + shouldWork.matches(regex));
    System.out.println("ShouldntWork: " + shouldntWork.matches(regex));
}

而且,当然,他们都决心.true

有人知道我做错了什么吗?我不一定需要使用消极的展望,我只需要解决问题,我认为消极的展望可能是做到这一点的一种方法。

谢谢


答案 1

尝试

String regex = "/foo/(?!.*bar).+";

或可能

String regex = "/foo/(?!.*\\bbar\\b).+";

以避免路径失败,我假设您确实希望该正则表达式匹配。/foo/baz/crowbars

说明:(没有 Java 字符串所需的双反斜杠)

/foo/ # Match "/foo/"
(?!   # Assert that it's impossible to match the following regex here:
 .*   #   any number of characters
 \b   #   followed by a word boundary
 bar  #   followed by "bar"
 \b   #   followed by a word boundary.
)     # End of lookahead assertion
.+    # Match one or more characters

\b,“单词边界锚点”,匹配字母数字字符和非字母数字字符(或字符串的开头/结尾与 alnum 字符之间的空白区域)。因此,它在 in 之前或之后匹配,但在 和 之间不匹配。br"bar"wb"crowbar"

专业提示:看看 http://www.regular-expressions.info - 一个很棒的正则表达式教程。


答案 2