Попытка найти ноль за пределами слова - PullRequest
0 голосов
/ 28 марта 2019

У меня есть шаблоны, такие как
FQC19515_TCELL001_20190319_165944.pdf
FQC19515_TBNK001_20190319_165944.pdf
Я могу сопоставить слова TCELL и TBNK с этим RegEX
^ (\ D +) - (\ d +) -. (\ D +) ([А-Z1-9] +) * 1 002 * *

Но если у меня есть шаблоны, такие как
FLW194640_ T20NK 022_20190323_131348.pdf
FLW194228_ C1920 _SOME_DEBRIS_REMOVED.pdf
приведенное выше регулярное выражение возвращает
T2 и C192 вместо T20NK и C1920 соответственно

Существует ли общее регулярное выражение, которое соответствует Nzeros за пределами этих слов?

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

Насколько я понимаю, вы могли бы использовать:

^[A-Z]+\d+_\K[A-Z0-9]{5}

Пояснение:

^                   # beginning of line
    [A-Z]+          # 1 or more capitals
    \d+_            # 1 or more digit and 1 underscore
    \K              # forget all we have seen until this position
    [A-Z0-9]{5}     # 5 capitals or digits

Демо

0 голосов
/ 28 марта 2019

Давайте рассмотрим все 4 примера ввода:

FQC19515_TCELL001_20190319_165944.pdf
FQC19515_TBNK001_20190319_165944.pdf
FLW194640_T20NK022_20190323_131348.pdf
FLW194228_C1920_SOME_DEBRIS_REMOVED.pdf

Первая группа, между началом строки и первым «_» (например, FQC19515 в строке 1), состоит из:

  • непустая последовательность букв,
  • непустая последовательность цифр.

Таким образом, регулярное выражение, соответствующее ему, включая начало якоря строки игруппа захвата:

^([A-Z]+\d+)

Вы использовали \D вместо [A-Z], но я думаю, что [A-Z] более конкретен, так как он соответствует только буквам , например, не "_ ".

Следующим исходным символом является _, поэтому регулярное выражение может также включать _.

A, теперь более сложная часть: вторая группа, которую нужно захватить, имеет фактически 2варианты:

  • последовательность букв и последовательность цифр (после этого есть «_»),
  • последовательность букв, последовательность цифр и другая последовательностьбуквы (после этого есть цифры, которые вы хотите опустить).

Таким образом, наиболее интуитивный способ - определить 2 альтернативыes, каждый с соответствующим положительным прогнозом :

  • альтернатива 1: [A-Z]+\d+(?=_),
  • альтернатива 2: [A-Z]+\d+[A-Z]+(?=\d).

Но есть немного более короткий путь.Обратите внимание, что обе альтернативы начинаются с [A-Z]+\d+.Таким образом, мы можем поместить этот фрагмент на первое место, а только остальные включить в качестве группы без захвата ((?:...)) с двумя альтернативами.Все вышеперечисленное должно быть окружено группой захвата :

([A-Z]+\d+(?:(?=_)|[A-Z]+(?=\d)))

Так что все регулярное выражение может быть:

^([A-Z]+\d+)_([A-Z]+\d+(?:(?=_)|[A-Z]+(?=\d)))

с опцией m ("^"также соответствует началу каждой строки).

Рабочий пример см. https://regex101.com/r/GDdt10/1

Ваше регулярное выражение: ^(\D+)-(\d+) неверно, как после последовательности нецифровых чисел (\D+) вы указали минус , которого нет в вашем источнике.Также второй минус не соответствует вашему вводу.

Редактировать

Чтобы соответствовать всем вашим строкам, я немного изменил предыдущее регулярное выражение.Изменения ограничены группой соответствия № 2 (после _):

  • Альтернатива № 1: [A-Z]{2,}+(?=\d) - две или более буквы, после них есть цифра, которая должна быть пропущена.Он будет соответствовать TCELL и TBNK.
  • Альтернатива № 2: [A-Z]+\d+(?:(?=_)|[A-Z]+(?=\d)) - предыдущее содержимое этой группы.Это будет соответствовать двум оставшимся случаям.

Таким образом, все регулярное выражение:

^([A-Z]+\d+)_([A-Z]{2,}+(?=\d)|[A-Z]+\d+(?:(?=_)|[A-Z]+(?=\d)))

Рабочий пример см. https://regex101.com/r/GDdt10/2

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