我有一个关于在java中匹配整个单词的问题,我想要做的是找到给定行中每个单词的起始索引
Pattern pattern = Pattern.compile("("+str+")\\b");
Matcher matcher = pattern.matcher(line.toLowerCase(Locale.ENGLISH));
if(matcher.find()){
//Doing something
}
我对这个案例有疑问
line = "Watson has Watson's items.";
str = "watson";
我想只匹配第一个watson,而不匹配另一个,我不希望我的模式有一些空的空间控制,在这种情况下该怎么做
答案 0 :(得分:1)
单词边界\b
匹配非单词和单词字符(或单词字符前/后的开始/结束)之间的位置。 '
,-
,+
等非单词字符,因此Watson\b
将匹配Watson's
(部分匹配)。
如果没有用非空格符号括起来,您可能只希望匹配Watson
:
Pattern p = Pattern.compile("(?<!\\S)" + str + "(?!\\S)");
要匹配句子末尾的Watson
,您需要在.
,?
和!
之前进行匹配,使用
Pattern p = Pattern.compile("(?<!\\S)" + str + "(?![^\\s.!?])");
请参阅regex demo
仅供参考:或许,最好还是使用Pattern.quote(str)
代替普通str
来避免在str
包含特殊正则表达式元字符时出现问题。
答案 1 :(得分:0)
在matcher中使用find()方法