Попытка сопоставить ноль за пределами слова bounderies

#regex

#регулярное выражение

Вопрос:

У меня есть шаблоны типа
FQC19515_TCELL001_20190319_165944.pdf
FQC19515_TBNK001_20190319_165944.pdf
Я могу сопоставить слова TCELL и TBNK с этим регулярным выражением
^(D )-(d )-(d )([A-Z1-9] )?.*

Но если у меня есть шаблоны типа
FLW194640_T20NK022_20190323_131348.pdf
FLW194228_C1920_SOME_DEBRIS_REMOVED.pdf
, приведенное выше регулярное выражение возвращает
T2 и C192 вместо T20NK и C1920 соответственно

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

Комментарии:

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

2. Каково здесь правило? Я могу придумать ^([A-Z] )(d )_([A-Z0-9] ?)d _ , видишь regex101.com/r/blgC8N/1 , но оно не получается C1920 , зачем его извлекать?

3. Извините, это регулярное выражение ^(D D D)(d d)(d )_([A-Z1-9] )_?.*. Важный раздел находится в ([A-Z1-9] ) части. Из приведенной выше строки мне нужно сопоставить для строки TCELL, TBNK, T20NK и C1920 одно общее правило регулярных выражений.

Ответ №1:

Давайте рассмотрим все 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] это
более конкретно, поскольку оно соответствует только буквам, а не, например, «_».

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

А теперь более сложная часть: вторая группа, подлежащая захвату, на самом деле имеет 2 варианта:

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

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

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

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

 ([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

Комментарии:

1. Ты потрясающий.

2. Как насчет этих шаблонов FQC19515_TCELL001_20190319_165944.pdf FQC19515_TBNK001_20190319_165944.pdf? Ваше решение возвращает TCELL001 и TBNK001. Они должны возвращать TCELL и TBNK.

Ответ №2:

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

 ^[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
  

ДЕМОНСТРАЦИЯ