我很困惑我的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;
}
}
如果有的话,我可以对我的正则表达式做什么来避免血腥不是空或空检查?
答案 0 :(得分:2)
删除?
,以便正则表达式只有(\\d+)
,因为当一系列包含一个或多个数字时,正则表达式匹配一次或多次。即使没有数字,正则表达式仍将匹配。
答案 1 :(得分:1)
?问号说前面的陈述是可选的。在字面意义上,您要求任何数字中至少有1个中的0或1。
将模式更改为"\\d+"
,它应该可以正常工作。
答案 2 :(得分:1)
请阅读:http://docs.oracle.com/javase/tutorial/essential/regex/quant.html
我相信你说你希望一组任何一个或多个数字出现或者根本不出现。这就是为什么如果它没有找到它仍然会返回一个匹配。我不确定你想要做什么,但我认为你可能会很好用“\ d +”