正規表現が作成すると思っていたよりも多くの一致を返すMatcherのfind()メソッドに混乱しています。以下は、これをハッシュ化するために作成したJUnitテストです。すべてのテストに合格しましたが、find()がgroup(1)値がnullまたは空の一致を返す理由がわかりません(//実際の一致よりもfind()が多いのはなぜですか?コードで賞賛します)?
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;
}
}
血まみれのヌルではないチェックや空のチェックを回避するために、正規表現に対して何ができますか?