我需要查看字符串中是否存在整个单词。这就是我尝试这样做的方式:
if(text.matches(".*\\" + word + "\\b.*"))
// do something
大多数单词都在运行,但以g
开头的单词会导致错误:
Exception in thread "main" java.util.regex.PatternSyntaxException:
Illegal/unsupported escape sequence near index 3
.*\great life\b.*
^
我该如何解决这个问题?
答案 0 :(得分:3)
错误的实际原因是您无法转义Java正则表达式中不能形成有效转义构造的字母字符。
在任何不表示转义构造的字母字符之前使用反斜杠是错误的;这些保留用于将来对正则表达式语言的扩展。可以在非字母字符之前使用反斜杠,无论该字符是否是未转义构造的一部分。
我使用
Matcher m = Pattern.compile("\\b" + word + "\\b").matcher(text);
if (m.find()) {
// A match is found
}
如果某个单词可能包含/ start / end with special chars,我会使用
Matcher m = Pattern.compile("(?<!\\w)" + Pattern.quote(word) + "(?!\\w)").matcher(text);
if (m.find()) {
// A match is found
}
答案 1 :(得分:2)
将".*\\" + word + "\\b.*"
与word = great life
一起使用会生成字符串".*\\great life\\b.*"
,其值为.*\great life\b.*
。问题是\g
不属于JAVA中转义序列的列表(参见What are all the escape characters in Java?)
您可以使用
if(text.matches(".*\\b" + word + "\\b.*"))
^
答案 2 :(得分:2)
\\
事物由任何字符继续进行解释为元字符。例如。 ".*\\geza\\b.*"
会尝试找到\g
转义序列,".*\\jani\\b.*"
会尝试查找\j
等等。
其中一些序列存在,其他序列不存在,您可以查看Pattern docs以获取详细信息。真正令人不安的是,这可能不是你想要的。
我同意Thomas Ayoub您可能需要匹配\\b...\\b
才能找到一个字。我会更进一步,我会使用Pattern.quote
来避免可能来自word
的无意识的正则表达式功能:
String text = "Lorem Ipsum a[asd]a sad";
String word = "a[asd]a";
if (text.matches(".*\\b" + Pattern.quote(word) + "\\b.*")) {
// do something
}