Как сопоставить все комбинации чисел в строке, которые не начинаются с буквы Engli sh при регулярном сопоставлении в Java - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть строка типа

String str = "305556710S  or 100596269C OR CN111111111";

Я просто хочу сопоставить символы в этой строке, которые начинаются с цифр или начинаются с цифр и заканчиваются буквами Engli sh, затем добавляем префикс к соответствующим символам и добавляем с двумя "??" персонажи. Я пишу Патерн как

    Pattern pattern = Pattern.compile("^[0-9]{1,10}[A-Z]{0,1}", Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(str);
    while (matcher.find()) {
        int start = matcher.start();
        int end = matcher.end();
        String matchStr = matcher.group();
        System.err.println(matchStr);
    }

Но он может соответствовать только первому символу "305556710S". Но если я изменю шаблон

 Pattern pattern = Pattern.compile("[0-9]{1,10}[A-Z]{0,1}", Pattern.CASE_INSENSITIVE);

, он будет соответствовать "305556710S", "100596269 C", "111111111". Но префикс "111111111" - это Engli sh символ "CN", который не моя цель Я только хочу сопоставить "305556710S" и "100596269 C" и добавить два "??" символы перед соответствующими персонажами. Кто-нибудь может мне помочь?

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Во-первых, вы должны избегать ^ в этом конкретном регулярном выражении. Как вы заметили, вы не можете вернуть более одного результата, так как «^» - это инструкция для «соответствовать началу строки»

Использование \ b может быть решением, но вы можете получить недопустимые результаты , Например,

305556710S or -100596269C OR CN111111111

Регулярное выражение "\\b[0-9]{1,10}[A-Z]{0,}\\b" будет соответствовать 100596269 C (поскольку дефис не является символом слова, поэтому между словами - и 1 существует граница слова)

Следующее регулярное выражение в точности соответствует тому, что вы хотите: все числа, за которыми могут следовать некоторые символы sh Engli, либо в начале строки, либо после пробела, либо после пробела или в конце строки.

(?<=^| )[0-9]{1,10}[A-Z]*(?= |$)

Пояснения:

  1. (? <= ^ |) </strong> - вид сзади. Это гарантирует, что есть или ^ (начало строки) или пробел за фактическим местоположением. Обратите внимание, что взгляды не добавляют подходящие символы к результату: пробел не будет частью результата
  2. [0-9] {1,10} [AZ] * совпадений цифры (не менее одной, до десяти), затем одна или несколько букв.
  3. (? = | $) - это взгляд в будущее. Он гарантирует, что после этого совпадения будет либо пробел, либо $ (конец строки). Как и в случае с lookbehinds, символы не добавляются в результаты, а позиция остается прежней: например, прочитанное здесь пространство может также быть прочитано внешним видом следующей захваченной строки

Примеры: 305556710S or 100596269C OR CN111111111 соответствует: по индексу 0 [305556710S], по индексу 15 [100596269C]; 100596269C123 не совпадает.

1 голос
/ 25 февраля 2020

Я думаю, вам нужно использовать границы слов \b. Попробуйте этот измененный шаблон:

"\\b[0-9]{1,10}[A-Z]{0,1}\\b"

Это распечатывает:

305556710S
100596269C

Почему это работает:

  1. Разница здесь что он будет проверять только те последовательности символов, которые находятся в пределах пары слов . В предыдущем шаблоне, который вы использовали, последовательность символов даже из середины слова может использоваться для сопоставления с шаблоном, из-за которого даже 11111... из CN1111... сопоставлялся с шаблоном, и он прошел.
  2. Граница слова также совпадает с концом ввода строки. Таким образом, даже если слово-кандидат появляется в конце строки, оно будет подхвачено.

Если в конце может присутствовать более одного алфавита Engli sh, удалите максимальное вхождение индикатор, 1 в данном случае:

"\\b[0-9]{1,10}[A-Z]{0,}\\b"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...