Java RegEx с ошибкой просмотра - PullRequest
1 голос
/ 18 февраля 2011

В Java я не смог заставить регулярное выражение вести себя так, как хотел, и написал этот небольшой тест JUnit, чтобы продемонстрировать проблему:

public void testLookahead() throws Exception {
    Pattern p = Pattern.compile("ABC(?!!)");
    assertTrue(p.matcher("ABC").find());
    assertTrue(p.matcher("ABCx").find());
    assertFalse(p.matcher("ABC!").find());
    assertFalse(p.matcher("ABC!x").find());
    assertFalse(p.matcher("blah/ABC!/blah").find());

    p = Pattern.compile("[A-Z]{3}(?!!)");
    assertTrue(p.matcher("ABC").find());
    assertTrue(p.matcher("ABCx").find());
    assertFalse(p.matcher("ABC!").find());
    assertFalse(p.matcher("ABC!x").find());
    assertFalse(p.matcher("blah/ABC!/blah").find());

    p = Pattern.compile("[A-Z]{3}(?!!)", Pattern.CASE_INSENSITIVE);
    assertTrue(p.matcher("ABC").find());
    assertTrue(p.matcher("ABCx").find());
    assertFalse(p.matcher("ABC!").find());
    assertFalse(p.matcher("ABC!x").find());
    assertFalse(p.matcher("blah/ABC!/blah").find()); //fails, why?

    p = Pattern.compile("[A-Za-z]{3}(?!!)");
    assertTrue(p.matcher("ABC").find());
    assertTrue(p.matcher("ABCx").find());
    assertFalse(p.matcher("ABC!").find());
    assertFalse(p.matcher("ABC!x").find());
    assertFalse(p.matcher("blah/ABC!/blah").find());  //fails, why?
}

Каждая строка проходит, кроме двух, помеченных знакомкомментарий.Группировки идентичны, за исключением строки шаблона.Почему добавление нечувствительности к регистру нарушает совпадение?

Ответы [ 2 ]

1 голос
/ 18 февраля 2011

Ваши тесты не пройдены, потому что в обоих случаях паттерн [A-Z]{3}(?!!)CASE_INSENSITIVE) и [A-Za-z]{3}(?!!) находит хотя бы одно совпадение в "blah/ABC!/blah" (они находят bla дважды).

Простые тесты показывают это:

Pattern p = Pattern.compile("[A-Z]{3}(?!!)", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("blah/ABC!/blah");
while(m.find()) {
    System.out.println(m.group());
}

отпечатки:

bla
bla
1 голос
/ 18 февраля 2011

Эти два не выдают ложных значений, потому что в полной строке есть подстроки, которые соответствуют шаблону. В частности, строка blah соответствует регулярному выражению (три буквы, за которыми не следует восклицательный знак). Чувствительные к регистру корректно завершаются ошибкой, потому что blah не в верхнем регистре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...