Давайте рассмотрим все 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