2012-01-19 3 views
0

Я смущен методом 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; 
    } 
} 

Что делать, если что-нибудь, я могу сделать с моим регулярным выражением, чтобы избежать кровавого нетонового или пустого чек?

ответ

2

Удалить ? так, чтобы ваше регулярное выражение было просто (\\d+), так как ваше регулярное выражение соответствует, если существует серия из одной или нескольких цифр, один или несколько раз. Даже если нет цифр, регулярное выражение все равно будет соответствовать.

+0

Aw, geez. Это так просто. Я люблю RegEx. Я борюсь с RegEx. Благодарю. –

+0

не заботится, мне понадобилось несколько лет, чтобы понять их! –

1

The? вопросительный знак говорит, что предыдущий оператор не является обязательным. В буквальном смысле вы запрашиваете 0 или 1 по крайней мере 1 любой цифры.

Измените схему на "\\d+", и она должна работать нормально.

+0

Мне все еще нужна группировка, но удаление? делает это. –

1

прочитать: http://docs.oracle.com/javase/tutorial/essential/regex/quant.html

я верю, что вы говорите, вы хотите, группа любой одной или более цифр, чтобы показать один раз или вообще не. поэтому, если он его не найдет, он все равно вернет совпадение. я точно не знаю, что вы хотите сделать, но я думаю, что вы, вероятно, будете в порядке с «\ d +»

Смежные вопросы