[...]是字符类,字符类只能匹配它指定的一个字符。例如,像字符类
[abc]只能匹配
aOR
bOR
c。因此,如果您只想查找单词,
abc请不要将其括起来
[...]。
另一个问题是您
\s用作单词分隔符,因此在下面的字符串中
String data = "foo foo foo foo";
正则表达式
\sfoo\s将无法首先匹配,
foo因为 之前没有空格 。
因此,它将找到第一个匹配项
String data = "foo foo foo foo";// this one--^^^^^
现在,由于正则表达式在第二秒后就消耗了空间,
foo因此无法在下一场比赛中重复使用它,因此第三次
foo也将被跳过,因为之前没有可用的空间来匹配。
您也不会匹配,
foo因为这次 之后 没有空格了。
要解决此问题,您可以使用
\b- 单词边界,它检查它代表的位置是否在字母数字字符与非字母数字字符之间(或字符串的开始/结尾)。
所以代替
Pattern p = Pattern.compile("[\s" + qp + "\s]");用
Pattern p = Pattern.compile("\b" + qp + "\b");Pattern p = Pattern.compile("\b" + qp + "\b",Pattern.UNICODE_CHARACTER_CLASS);确保
\b在预定义的字母数字类中包含阿拉伯字符。
更新:
我不确定您的单词是否可以包含正则表达式元字符(例如)
{ [
+
*,以防万一,您还可以添加转义机制以将此类字符转换为文字。
所以
"\b" + qp + "\b"
可以变成
"\b" + Pattern.quote(qp) + "\b"



