Аномалия регулярного выражения (Java) - искомое объяснение - PullRequest
1 голос
/ 30 октября 2009

Использование Java (1.6) Я хочу разбить входную строку, содержащую компоненты заголовка, а затем количество токенов. Токены соответствуют этому формату: а! char, пробел, затем имя токена из 2 символов (из ограниченного списка, например, C0 или 04) и затем 5 цифр. Я построил шаблон для этого, но он не работает для одного токена (CE), если я не уберу требование для 5 цифр после имени токена. Модульный тест объясняет это лучше, чем я мог (см. Ниже)

Может кто-нибудь помочь с тем, что происходит с моей ошибкой? Для меня входной токен выглядит нормально ...

Ура! * * 1005

@Test
public void testInputSplitAnomaly() {
    Pattern pattern = Pattern.compile("(?=(! [04|C0|Q2|Q6|C4|B[2-6]|Q[8-9]|C6|CE]\\d{5}))");
    splitByRegExp(pattern);
}
@Test
public void testInputSplitWorks() {
    Pattern pattern = Pattern.compile("(?=(! [04|C0|Q2|Q6|C4|B[2-6]|Q[8-9]|C6|CE]))");
    splitByRegExp(pattern);
}


public void splitByRegExp(Pattern pattern) {
    String input = "& 0000800429! C600080 123456789-! C000026 213  00300! 0400020 A1Y1! Q200002 13! CE00202 01 ! Q600006 020507! C400012 O00511011";
    String[] tokens = pattern.split(input);
    Arrays.sort(tokens);
    System.out.println("-----------------------------");
    for (String token : tokens) {
        System.out.println(token.substring(0,11));
    }
    assertThat(tokens,Matchers.hasItemInArray(startsWith("! CE")));
    assertThat(tokens.length,is(8));
}

Ответы [ 2 ]

1 голос
/ 30 октября 2009

Я думаю, что ваша ошибка здесь в том, что вы использовали квадратные скобки. Не забывайте, что они указывают на класс символов, поэтому [04|C0|Q2|Q6|C4|B[2-6]|Q[8-9]|C6|CE] не делает то, что вы ожидаете.

Что делает делает следующее:

  • [04|C0|Q2|Q6|C4|B[2-6] представляет собой класс символов, соответствующий одному из: |, [, 0, 2, 3, 4, 5, 6, B , C или Q,
  • Остальное интерпретируется как перечисление набора альтернатив, в частности, класс символов, упомянутых выше, или Q[8-9] * или * C6 * или * CE]. Вот почему CE не работает, потому что у него нет квадратной скобки.

Что вы, вероятно, после того, как (?:04|C0|Q2|Q6|C4|B[2-6]|Q[8-9]|C6|CE)

1 голос
/ 30 октября 2009

Это не имеет никакого смысла:

[04|C0|Q2|Q6|C4|B[2-6]|Q[8-9]|C6|CE]

Я верю, что вы хотите:

(?:04|C0|Q2|Q6|C4|B[2-6]|Q[8-9]|C6|CE)

Квадратные скобки используются только для классов символов, а не для общей группировки. Используйте (?:...) или (...) для общей группировки (последняя также захватывает).

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