它应该只与确切的单词匹配。
private void checkMatch() {
String source1 = "search engines has ";
String source2 = "search engine exact word";
String source3 = "enginecheck";
String source4 = "has hashtag #engine";
String key = "engine";
System.out.println(isContain(source1, key));
System.out.println(isContain(source2, key));
System.out.println(isContain(source3, key));
System.out.println(isContain(source4, key));
}
private boolean isContain(String source, String subItem) {
String pattern = "\\b" + subItem + "\\b";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(source);
return m.find();
}
**Expected output**
false
true
false
false
**actual output**
false
true
false
true
答案 0 :(得分:1)
对于这种情况,您必须使用正则表达式OR而不是单词边界。 \\b
匹配单词char和非单词char(反之亦然)。因此,您的正则表达式应该会在#engine
中找到匹配项,因为#
是一个非单词字符。
private boolean isContain(String source, String subItem) {
String pattern = "(?m)(^|\\s)" + subItem + "(\\s|$)";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(source);
return m.find();
}
或
String pattern = "(?<!\\S)" + subItem + "(?!\\S)";
答案 1 :(得分:0)
更改您的模式如下。
String pattern = "\\s" + subItem + "\\b";
答案 2 :(得分:0)
如果要查找用空格或字符串的开头/结尾括起来的文字文本,可以使用像\s+
这样的空白模式拆分字符串,并检查是否有任何块等于搜索文本。
String s = "Can't start the #engine here, but this engine works";
String searchText = "engine";
boolean found = Arrays.stream(s.split("\\s+"))
.anyMatch(word -> word.equals(searchText));
System.out.println(found); // => true
答案 3 :(得分:0)
将正则表达式更改为
String pattern = "\\s"+subItem + "\\s";
我正在使用
\ s一个空格字符:[\ t \ n \ x0B \ f \ r \ n]
有关详细信息,请查看java.util.regex.Pattern javadoc
另外,如果你想支持这样的字符串:
"has hashtag engine"
"engine"
您可以通过添加结尾/起始行终止符(^和$)来改进它 通过使用这种模式:
String pattern = "(^|\\s)"+subItem + "(\\s|$)";