我有以下正则表达式(下面的代码),但是我很困惑为什么它不返回'Banas',因为它是一个单词并且在2到20个字符之间。
Pattern p = Pattern.compile("\\s[A-Za-z]{2,20}\\s");
Matcher m = p.matcher(" Derek Banas CA 1234 PA (750)555-1234");
while(m.find()){
System.out.println(m.group());
}
输出如下。为什么“Banas”不在输出中?感谢。
Derek CA PA
答案 0 :(得分:6)
因为第一次匹配在Derek
之后消耗了空间,所以Banas
无法在开始时使用它。尝试将正则表达式更改为"\\b[A-Za-z]{2,20}\\b"
。 \\b
为word boundary,仅匹配
- 在字符串中的第一个字符之前,如果第一个字符是单词字符。
- 在字符串中的最后一个字符之后,如果最后一个字符是单词字符。
字符串中两个字符之间的- ,其中一个是单词字符,另一个不是单词字符。
答案 1 :(得分:3)
因为正则表达式的开头和结尾都有空格。因此,当你的正则表达式找到“Derek”时,你的字符串的下一部分是“Banas”,你的正则表达式只适用于“Banas”。
答案 2 :(得分:1)
使用\\b
(作为@Pshemo回答)可能是您问题的最佳答案。我想提一下另一种可能性:如果你使用前瞻,你可以寻找一个空间(或任何其他模式)而不消耗它。
Pattern p = Pattern.compile("\\s[A-Za-z]{2,20}(?=\\s)");
现在,如果字母序列后跟空格,则模式将匹配,但空格不会成为匹配的一部分,并且它将保留在字符串中,以便下次调用{时可以匹配它{1}}。 find()
返回的字符串为m.group()
," Derek"
," Banas"
," CA"
。