检查结果是否唯一

时间:2014-10-10 19:26:26

标签: java regex

我想从文本中提取3-5个长度。下面的模式适用于我的所有情况。

    Pattern pattern = Pattern.compile("(^|[\\D]|.*[\\D])(?<number>[0-9]{3,5})($|[\\D]|[\\D].*)");

    //Working examples always returns 111
    //Matcher m = pattern.matcher("XX 111, YYY 37124091");
    //Matcher m = pattern.matcher("XX 111");
    //Matcher m = pattern.matcher("X111");
    //Matcher m = pattern.matcher("111");

我遇到的唯一问题是,我认为模式应该从下面的例子(111,123)中找到几个匹配,而不是只返回123

    Matcher m = pattern.matcher("XX 111, CCC 123 YYY 37124091");

    while(m.find()){
        System.out.println(m.group("number");
    }

如何确定模式确实匹配了2次,或者为什么它不匹配111和123?

3 个答案:

答案 0 :(得分:3)

只需将其更改为惰性量词。

 # "(^|[\\D]|.*?[\\D])(?<number>[0-9]{3,5})($|[\\D])"

 (                                  # (1 start)
      ^ 
   |  [\D] 
   |  .*? [\D] 
 )                                  # (1 end)
 (?<number>                         # (2 start)
      [0-9]{3,5} 
 )                                  # (2 end)
 (                                  # (3 start)
      $ 
   |  [\D] 
 )                                  # (3 end)

输出:

 **  Grp 0 -  ( pos 0 , len 7 ) 
XX 111,  
 **  Grp 1 -  ( pos 0 , len 3 ) 
XX   
 **  Grp 2 -  ( pos 3 , len 3 ) 
111  
 **  Grp 3 -  ( pos 6 , len 1 ) 
,  

-----------------

 **  Grp 0 -  ( pos 7 , len 9 ) 
 CCC 123   
 **  Grp 1 -  ( pos 7 , len 5 ) 
 CCC   
 **  Grp 2 -  ( pos 12 , len 3 ) 
123  
 **  Grp 3 -  ( pos 15 , len 1 ) 

答案 1 :(得分:1)

  

我遇到的唯一问题是,我认为模式应该从下面的例子(111,123)中找到几个匹配,而不是只返回123

你需要让*量词不愿意而不是贪婪。

为您的数据

XX 111, CCC 123 YYY 37124091

.*\\D部分将能够匹配

"XX 111, CCC "  
 ^---------^^
      |     |
     .*    \\D

消费111

尝试更改

Pattern.compile("(^|\\D|.*\\D)(?<number>[0-9]{3,5})($|\\D|\\D.*)");

Pattern.compile("(^|\\D|.*?\\D)(?<number>[0-9]{3,5})($|\\D|\\D.*?)");
//add these               ^                                     ^

同样\\D本身也是一个角色类,所以你不需要用[..]包围它。换句话说,您不需要将其写为[\\D],简单\\D就足够了。


  

如何识别模式确实匹配2次

正则表达式不会记住以前匹配的所有结果。如果您只想获取唯一值,请将它们存储在Set中。

答案 2 :(得分:-1)

要识别三到五位数字,您需要使用类似\b[1-9]\d{2,4}\b

的内容