我试图找到解决此问题的方法失败: 查找可识别包含一个单词且不包含其他单词的字符串的Java正则表达式。
为了更清楚,作为一个例子,让我们检查我的句子是否包含“方法”并且不包含“有效”作为整个单词(意味着它不能成为另一个单词的一部分)。正则表达式匹配器应返回,例如:
This method was efficient. false (contains "method", but contains "efficient")
This method was unefficient. true (cont. "method" doesn't cont. "efficient")
This method was simple. true (cont. "method" doesn't cont. "efficient")
This routine is efficient false (cont. "efficient" but no "method")
到目前为止我尝试过的,至少是最近的解决方案。
( method )(?!.*efficient.*) Almost there, but "unefficient" also triggers.
( method )(?!.* efficient .*) No. Now " method " doesn't trigger anymore.
((.*method.*)(?!.*efficient.*)) No. the absence of "efficient" doesn't trigger.
所以这似乎是一个完全单词匹配的问题。所以我最初也尝试过:
(.*\bmethod\b.*)(?!.*efficient.*)
也是为了不依赖于空格来绑定每个单词。 但没什么。我几乎整天都在尝试,这很痛苦。
我正在使用 http://www.regular-expressions.info/refquick.html 作为参考网站,和 http://regexpal.com/ 用于测试。
谢谢! d。
答案 0 :(得分:2)
怎么样:
^(?=.*\bmethod\b)(?!.*\befficient\b)
答案 1 :(得分:1)
我只想改进你的第一种方法(( method )(?!.*efficient.*)
)。
您已经说过Almost there
了,为什么不采取这种方法呢?我刚刚在\b
之前添加了一个字边界efficient
,因此不会排除unefficient
:
^.+(method)(?!.*\befficient.*)
<小时/>
现在剩下一件事了:
this is an efficient method
仍然是一个不受欢迎的匹配(我猜)。
因此,您可以在主要组前面添加前瞻以消除此匹配。
^(?!.*\befficient.*).*(method)
<小时/> 为了准确匹配
efficient
,您应该添加另一个字边界,否则它也会匹配efficients
:
^(?!.*\befficient\b).*(\bmethod)
如果您想使method
完全匹配,只需在其后添加另一个边界即可。现在,这将匹配methods
。
答案 2 :(得分:1)
您可以执行以下操作:
Pattern p = Pattern.compile("(\\bmethod\\b)?.*(\\befficient\\b)?";
Matcher m = p.matcher("The method is unefficient.");
if (m.find()
&& ((m.group(1) == null) != (m.group(2) == null))) {
// found exactly 1 word.
...
}
else // found 0 or 2 words.
唯一的限制是单词必须以该顺序出现。 但这可以通过添加看起来相同的替代方案来解决,除了 单词被切换。然后第3组和第4组不能同时为null或null