我需要一个正则表达式,只有当它没有后跟正斜杠(/)字符并且我想匹配整个字符串时才匹配字符串。
例如,下面的字符串应匹配
/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来实现这个目标?
答案 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中的下一个子字符串。