регулярное выражение для соответствия определенному шаблону строки с последующими цифрами - PullRequest
0 голосов
/ 30 октября 2019

Пример ввода:

___file___name___2000___ed2___1___2___3
DIFFERENT+FILENAME+(2000)+1+2+3+ed10

Требуемый вывод (например, все буквы и 4-значные цифры и буквенное «ed», за которыми сразу следует цифра произвольной длины:

file name 2000 ed2
DIFFERENT FILENAME 2000 ed10

Я использую: [A-Za-z]+|[\d]{4}|ed\d+, который только возвращает: file name 2000 ed DIFFERENT FILENAME 2000 ed

Я вижу, что здесь есть связанный Q + A: Регулярное выражение для соответствия конкретной строке, за которой следует число?

например, использование ed[0-9]* будет соответствовать ed#, но не уверены, почему оно не соответствует приведенному выше.

Ответы [ 3 ]

3 голосов
/ 30 октября 2019

Как написано, ваше регулярное выражение верно. Помните, однако, что регулярное выражение пытается сопоставить свои утверждения слева направо. Ваш ed\d+ никогда не будет совпадать, потому что ed был уже использован вашей альтернативой [A-Za-z]. Переупорядочьте свое регулярное выражение, и оно будет работать просто отлично:

ed\d+|[a-zA-Z]+|\d{4}

Демо

2 голосов
/ 30 октября 2019

Ответ Ника правильный, но поскольку сопоставление по порядку может быть менее читабельной "ошибкой", наилучшими (нечувствительными к порядку) способами такого рода поиска являются: 1) с указанными разделителями и 2) путем создания каждогоуникальный термин для поиска.

Ответ Яна хорошо обрабатывает # 1. Но вам нужно будет указать каждый конкретный разделитель, включая его длину (например, ___). Похоже, у вас могут быть какие-то необычные разделители, поэтому это может быть не идеально.

Для # 2 вы можете сделать каждый поисковый запрос уникальным. (То есть вы хотите, чтобы вещь, совпадающая с «файлом» и «именем», отличалась от вещи, совпадающей с «2000», и обе вещи отличались от вещи, совпадающей с «ed2».)

Один способсделать это [A-Za-z]+(?![0-9a-zA-Z])|[\d]{4}|ed\d+. Это говорит о том, что для первого типа поискового запроса вам нужна строка алфавита, за которой следует не алфавитно-цифровой символ. Это отличает его от третьего поискового термина, который представляет собой строку алфавита, за которой следуют некоторые цифры. Это также позволяет вам указать любой диапазон разделителей внутри этого негативного вида сзади .

demo

1 голос
/ 30 октября 2019

Вы можете очень хорошо использовать (просто захватите первую группу захвата):

(?:^|___|[+(])    # delimiter before
([a-zA-Z0-9]{2,}) # the actual content
(?=$|___|[+)])    # delimiter afterwards

См. демо на regex101.com

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