为什么这个正则表达式不返回第二个单词

时间:2014-01-02 03:24:30

标签: java regex regex-negation

我有以下正则表达式(下面的代码),但是我很困惑为什么它不返回'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

3 个答案:

答案 0 :(得分:6)

因为第一次匹配在Derek之后消耗了空间,所以Banas无法在开始时使用它。尝试将正则表达式更改为"\\b[A-Za-z]{2,20}\\b"\\bword 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"