Меня смущает метод find () моего Matcher, который возвращает больше совпадений, чем я ожидал, что мое регулярное выражение создаст. Ниже приведен тест JUnit, который я написал, чтобы попытаться выяснить это. Все тесты пройдены, но я не понимаю, почему мой find () возвращает совпадения, чье значение group (1) равно нулю или пусто (см. // Почему больше find (), чем фактических совпадений? Commend в коде)?
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;
}
}
Что, если что-нибудь, я могу сделать с моим регулярным выражением, чтобы избежать проверки кровавых, не нулевых или пустых?