Java正则表达式:负前瞻

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

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

我最初提出的正则表达式是:
分别为/foo/+/foo/+/bar/+

我认为第二个正则表达式很好。它将只匹配第二个字符串。但是,第一个正则表达式与这两个正则表达式都匹配。所以,我开始(第一次)用消极的前瞻性来玩弄。我设计了regex/foo/+(?!bar),并设置了以下代码来测试它

公共静态void main(字符串[]args){
字符串shouldWork=“/foo/abc123doremi”;
字符串shouldntWork=“/foo/abc123doremi/bar/def456fasola”;
字符串regex=“/foo/+(?!bar)”;
System.out.println(“ShouldWork:+ShouldWork.matches(regex));
System.out.println(“ShouldntWork:+ShouldntWork.matches(regex));
}

当然,它们都是true

有人知道我做错了什么吗?我不需要使用消极的前瞻,我只需要解决问题,我认为消极的前瞻可能是一种方法

谢谢

试一试

String regex=“/foo/(?!*bar)。+”;

或者可能

String regex=“/foo/(?!!.\\bbar\\b)。+”;

为了避免像/foo/baz/crowbar这样的路径出现故障,我假设您确实希望正则表达式匹配

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

/foo/#Match”/foo/“
(?!#断言此处不可能匹配以下正则表达式:
.#任意数量的字符
\b#后跟单词边界
bar#后跟“bar”
\b#后跟单词边界。
)#结束先行断言
.+#匹配一个或多个字符

\b“单词边界锚定”匹配字母数字字符和非字母数字字符(或字符串的开始/结束和alnum字符)之间的空格。因此,它在“bar”中的b之前或r之后匹配,但在“crowbar”中的wb之间无法匹配

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

发表评论