Java正则表达式抛出java.util.regex.PatternSyntaxException:字母g的非法/不支持的转义序列

时间:2017-04-25 16:27:40

标签: java regex

我需要查看字符串中是否存在整个单词。这就是我尝试这样做的方式:

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.*
   ^

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

错误的实际原因是您无法转义Java正则表达式中不能形成有效转义构造的字母字符。

请参阅Java regex documentation

  

在任何不表示转义构造的字母字符之前使用反斜杠是错误的;这些保留用于将来对正则表达式语言的扩展。可以在非字母字符之前使用反斜杠,无论该字符是否是未转义构造的一部分。

我使用

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
}