Я смущен методом my Matcher find(), возвращающим больше совпадений, чем я думал, что мое регулярное выражение создаст. Ниже приведен тест JUnit, который я написал, чтобы попытаться это сделать. Все тесты проходят, но я не понимаю, почему мои find() возвращают совпадения, значение группы которых (1) равно null или пустое (см. // Почему больше find() s, чем фактические совпадения? Комментировать в коде)?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. Благодарю. –
не заботится, мне понадобилось несколько лет, чтобы понять их! –