私の正規表現のfind()メソッドは、私の正規表現が作成すると思われるよりも多くのマッチを返すと混乱します。以下は、これをハッシュしようとしたJUnitテストです。すべてのテストは合格しますが、なぜ私のfind()戻り値がgroup(1)の値がnullまたは空の場合に一致するのか理解できません(//なぜもっと多くのfind()が実際の一致よりも?matcher.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;
}
}
何かあれば、私の正規表現で空でないチェックを避けるために何ができますか?
Aw、geez。それは簡単です。私はRegExが大好きです。私はRegExと闘う。ありがとう。 –
心配しなくても、それを理解するのに数年かかりました! –