正则表达式,仅当字符串后面没有特定字符时才匹配字符串

时间:2012-11-16 12:15:53

标签: java regex lookahead

我需要一个正则表达式,只有当它没有后跟正斜杠(/)字符并且我想匹配整个字符串时才匹配字符串。

例如,下面的字符串应匹配

/Raj/details/002-542545-1145457

但不是这个

/Raj/details/002-542545-1145457/show

我尝试使用Negative Lookahead来实现this answer指定的。

我的代码是这样的。

pattern = Pattern.compile("/.*/details/(?!.*/)");
matcher = pattern.matcher(text);
if(matcher.matches()) {
  System.out.println("success");
} else {
System.out.println("failure");
}

失败了。但是如果我使用matcher.find()那么它就会取得成功。

请帮助我理解为什么它不匹配和reg-exp来实现这个目标?

3 个答案:

答案 0 :(得分:3)

这个

^/[^/]+/details/[^/]+$

将匹配

/Raj/details/002-542545-1145457

但不是

/Raj/details/002-542545-1145457/show

答案 1 :(得分:1)

我认为你的正则表达没有做你期望它做的事情。您缺少在/details/之后捕获数值数据的表达式的一部分。

你的正则表达式对.find()是正的,因为当前表达式的字符串内部匹配,但字符串与表达式完全匹配,这就是.matches()不起作用的原因。

您当前的表达式不是贪婪的搜索,它会在到达/details/后立即停止匹配。如果/之后有/details/,则匹配失败,因此它与您的示例中的数字数据/details/和任何潜在/之间的字符不匹配。这导致.matches()失败,即使仍然存在正匹配。

如果您希望它匹配整个字符串,包括数字,但之后没有任何内容,则以下正则表达式应该有效:/.*/details/[0-9\-]*(?!.*/) - 同时.find().matches()将返回积极的,因为表达式现在匹配所有可能的/

答案 2 :(得分:0)

你的正则表达式看起来不错。 matcher()仅匹配整个String,而find()匹配String中的下一个子字符串。