我想过滤掉包含1个数字和3个大写字母且总长度为4的所有单词。请参阅我的示例:http://gskinner.com/RegExr/?32taa
ArrayList<String> result = new ArrayList<String>();
for(int i = 0; i <= 10; i++){
String message = resp.data.get(i).message;
Matcher m = MY_PATTERN.matcher("\b(?=[^\d]*\d[^\d]*)[A-Z\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
换成另一封信?
答案 0 :(得分:5)
Regex
不适合String
...
所以你需要使用\\d
代替\d
- 撰写\
时 java 需要n
或b
或t
或{{1很少有人...... 之后,但是当你给a
时,它会受到生命的冲击,并想想到底是什么......我对{{ {1}},所以我们需要告诉java d
应该按字面意思理解,而不是期望它作为转义字符。
- 在。(点)的情况下,它变得更加复杂,当你给\d
java字面意思,但它是一个正则表达式,所以你需要让它看起来像这样,所以你用\
作为前缀,所以它变成"."
,现在再次出现问题,因为现在java接受\
或{{1在\.
之后,它会得到一个n
,因此我们再次将其作为另一个b
的前缀,现在它变为\
答案 1 :(得分:4)
在Java中,当用字符串表示模式时,需要使用额外的反斜杠来转义backslash
。
因此,\b
应为\\b
,\d
应为\\d
。
答案 2 :(得分:3)
您的代码有两个问题:
您的模式错误,因为它允许更多数字 - 请参阅http://regexr.com?32u3e
Java需要双重转义斜线...
使用正则表达式
\\b(?=[A-Z]*\\d[A-Z]*\\b)[A-Z\\d]{4}\\b