#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