matcher.find()匹配太多了

时间:2012-01-19 01:03:17

标签: java regex regex-greedy

我很困惑我的Matcher的find()方法返回的匹配次数超过了我认为我的正则表达式会创建的。下面是我写的JUnit测试,试图将其哈希。所有的测试都通过了,但我不明白为什么我的find()返回其group(1)值为null或为空的匹配(参见//为什么find()s比实际匹配更多?在代码中推荐?)

public class JustTheDigits {
    @Test
    public void testJustTheDigits() {
        doTest( "DV_APLCN: 563 ,DV_DHR_APLCN: 5632, PIC_NOTE: 6254", new ArrayList<Integer>( Arrays.asList( 563, 5632, 6254 ) ) );
        doTest( "563 ,DV_DHR_APLCN: 5632, PIC_NOTE", new ArrayList<Integer>( Arrays.asList( 563, 5632 ) ) );
        doTest( "hello 563 jello", new ArrayList<Integer>( Arrays.asList( 563 ) ) );
        doTest( "Hello World", new ArrayList<Integer>() );
    }

    private void doTest( String candidate, List<Integer> expected ) {
        List<Integer> actual = justTheDigits( candidate );
        assertEquals( expected, actual );
    }

    private static Pattern pattern = Pattern.compile( "(\\d+)?" );

    public List<Integer> justTheDigits( String input ) {
        List<Integer> listOfDigits = new ArrayList<Integer>();
        Matcher matcher = pattern.matcher( input );
        while ( matcher.find() ) {
            String s = matcher.group( 1 );
            // Why more find()s than actual matches?
            if ( s != null && "".equals( s ) == false ) {
                listOfDigits.add( Integer.parseInt( s ) );
            }
        }
        return listOfDigits;
    }
}

如果有的话,我可以对我的正则表达式做什么来避免血腥不是空或空检查?

3 个答案:

答案 0 :(得分:2)

删除?,以便正则表达式只有(\\d+),因为当一系列包含一个或多个数字时,正则表达式匹配一次或多次。即使没有数字,正则表达式仍将匹配。

答案 1 :(得分:1)

?问号说前面的陈述是可选的。在字面意义上,您要求任何数字中至少有1个中的0或1。

将模式更改为"\\d+",它应该可以正常工作。

答案 2 :(得分:1)

请阅读:http://docs.oracle.com/javase/tutorial/essential/regex/quant.html

我相信你说你希望一组任何一个或多个数字出现或者根本不出现。这就是为什么如果它没有找到它仍然会返回一个匹配。我不确定你想要做什么,但我认为你可能会很好用“\ d +”