Java的正则表达式:负前瞻(Java regex: Negative lookahead)

2019-06-25 15:44发布

我想手艺两个正则表达式将匹配的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

任何人都知道我做错了吗? 我并不需要一定使用负前瞻,我只需要解决的问题,我认为排除模式可能是做这件事。

谢谢,

Answer 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 ,将“字边界锚”,相匹配的字母数字字符和一个非字母数字字符(或字符串的开始/结束和一个字母数字之间)之间的空的空间。 因此,在之前匹配b或后r"bar" ,但它未能之间不匹配wb"crowbar"

普罗蒂普:看看http://www.regular-expressions.info -一个伟大的正则表达式的教程。



文章来源: Java regex: Negative lookahead