转义序列无效

我想过滤掉所有包含1个数字和3个大写字母且总长度为4的单词。请参阅我的示例: http : //gskinner.com/RegExr/?32taa

ArrayList result = new ArrayList(); for(int i = 0; i <= 10; i++){ String message = resp.data.get(i).message; Matcher m = MY_PATTERN.matcher("\b(?=[^\d]*\d[^\d]*)[AZ\d]{4}\b"); while (m.find()) { String s = m.group(1); result.add(s); } } 

但是,当我将我的正则表达式模式传递给匹配器方法时,我得到错误:

 Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ ) 

我需要用另一个字母交换\d吗?

您的代码有两个问题:

  • 你的模式是错误的,因为它允许更多数字 – 请参阅http://regexr.com?32u3e

  • Java需要双重转义斜杠……

使用正则表达式模式

 \\b(?=[AZ]*\\d[AZ]*\\b)[AZ\\d]{4}\\b 

Regex不适合String

所以你需要使用\\d而不是\d

当你写\ java期望nbt或者其他几个…… 之后 ,但是当你给它时它会得到生命的震撼,想想到底是什么……我什么都不知道关于\d ,所以我们需要告诉java 应该从字面上理解它而不是期望它作为转义字符。

在案件中 (点)当你给"."时,它变得更加复杂"." java从字面上理解,但它是一个正则表达式,所以你需要让它看起来像那样,所以你用\前缀它,所以它成为\. ,现在再次出现与前一个问题相同的问题,因为现在java在\之后接受nb等,但它得到一个"." ,所以我们再次用另一个\前缀,所以现在它变为\\.

在Java中,当用字符串表示模式时,需要使用额外的反斜杠来转义backslash

所以, \b应该是\\b ,而\d应该是\\d