我对我的 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;
}
}
如果有的话,我可以对我的正则表达式做些什么来避免血腥的非空或空检查?