Java 检查结果是否唯一

Java 检查结果是否唯一,java,regex,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"); //Mat

我想从文本中提取一个长度为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");
我如何确定模式匹配了2次,或者为什么它不匹配111和123

我遇到的唯一问题是,正如我所相信的,当模式应该找到下面示例(111123)中的几个匹配项时,它只返回123

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

    while(m.find()){
        System.out.println(m.group("number");
    }
你需要使量词不情愿而不是贪婪

为您的数据

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)(?[0-9]{3,5})($|\\D |\\D.*);

Pattern.compile((^ |\\D |。*?\\D)([0-9]{3,5})($|\\D |\\D.*));
//添加这些^^
另外,
\\D
本身就是字符类,所以您不需要用
[…]
包围它。换句话说,你不需要把它写成
[\\D]
,简单的
\\D
就足够了


我如何确定模式匹配了2次

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

我遇到的唯一问题是,正如我所相信的,当模式应该找到下面示例(111123)中的几个匹配项时,它只返回123

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

    while(m.find()){
        System.out.println(m.group("number");
    }
你需要使量词不情愿而不是贪婪

为您的数据

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)(?[0-9]{3,5})($|\\D |\\D.*);

Pattern.compile((^ |\\D |。*?\\D)([0-9]{3,5})($|\\D |\\D.*));
//添加这些^^
另外,
\\D
本身就是字符类,所以您不需要用
[…]
包围它。换句话说,你不需要把它写成
[\\D]
,简单的
\\D
就足够了


我如何确定模式匹配了2次

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

我遇到的唯一问题是,正如我所相信的,当模式应该找到下面示例(111123)中的几个匹配项时,它只返回123

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

    while(m.find()){
        System.out.println(m.group("number");
    }
你需要使量词不情愿而不是贪婪

为您的数据

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)(?[0-9]{3,5})($|\\D |\\D.*);

Pattern.compile((^ |\\D |。*?\\D)([0-9]{3,5})($|\\D |\\D.*));
//添加这些^^
另外,
\\D
本身就是字符类,所以您不需要用
[…]
包围它。换句话说,你不需要把它写成
[\\D]
,简单的
\\D
就足够了


我如何确定模式匹配了2次

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

我遇到的唯一问题是,正如我所相信的,当模式应该找到下面示例(111123)中的几个匹配项时,它只返回123

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

    while(m.find()){
        System.out.println(m.group("number");
    }
你需要使量词不情愿而不是贪婪

为您的数据

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)(?[0-9]{3,5})($|\\D |\\D.*);

Pattern.compile((^ |\\D |。*?\\D)([0-9]{3,5})($|\\D |\\D.*));
//添加这些^^
另外,
\\D
本身就是字符类,所以您不需要用
[…]
包围它。换句话说,你不需要把它写成
[\\D]
,简单的
\\D
就足够了


我如何确定模式匹配了2次


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

只需将其更改为惰性量词即可

 # "(^|[\\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)

把它改成一个懒惰的量词

 # "(^|[\\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)

把它改成一个懒惰的量词

 # "(^|[\\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)

把它改成一个懒惰的量词

 # "(^|[\\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)

对于识别三到五位数的数字,您想使用这样的东西来识别三到五位数的数字,您想使用这样的东西来识别三到五位数的数字,您想使用这样的东西来识别三到五位数的数字\b

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

您使用的是Java 7吗?@sln yes使用的是最新的1.7。您使用的是Java 7吗?@sln yes使用的是最新的1.7。您使用的是Java 7吗?@sln yes使用的是最新的1.7。不回答问题,但可能是一个有用的注释。不回答问题,但可能是有用的评论。不回答问题,但可能是有用的评论。不回答问题,但可能是有用的评论。