0

我对我的 Matcher 的 find() 方法返回的匹配项比我认为我的正则表达式创建的更多匹配项感到困惑。下面是我编写的 JUnit 测试,试图解决这个问题。所有的测试都通过了,但我不明白为什么我的 find() 返回匹配其 group(1) 值为 null 或空的匹配项(请参阅 //Why more find()s than actual matches?common in the code)?

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;
    }
}

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

4

3 回答 3

2

删除,?以便您的正则表达式(\\d+)与您的正则表达式在有一系列一个或多个数字时匹配,一次或多次。即使没有数字,正则表达式仍然会匹配。

于 2012-01-19T01:07:09.973 回答
1

这 ?问号表示前面的语句是可选的。从字面上看,您要求任何数字的至少 1 个中的 0 或 1。

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

于 2012-01-19T01:07:26.430 回答
1

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

我相信您是说您希望一组任何一个或多个数字显示一次或根本不显示。这就是为什么如果它没有找到它,它仍然会返回一个匹配项。我不确定你到底想做什么,但我认为你可能对 "\d+" 没问题

于 2012-01-19T01:16:10.560 回答