Регулярное выражение - Условный Lookbehind, запуск фильтра? - PullRequest
1 голос
/ 24 февраля 2020

Я пытаюсь выполнить некоторые проверки строки, где я использую регулярное выражение, используя lookbehind и lookahead, чтобы получить определенную часть фрагмента текста. Типичный формат текста следующий:

BS-123456.v2019

Часть текста, которую я извлекаю, - 123456 с использованием следующего регулярного выражения:

(?<=\-)(.*?)(?=\.v)

По сути, я всегда хочу получить часть текста между дефисом '-' и частью '.v'.

Это хорошо работает.

Однако мне нужно откорректировать, чтобы отфильтровать все, что начинается со слова «Копировать», игнорируя регистр. Например, если у меня есть следующий текст:

Copy_BS-123456.v2019

или Copy-BS-123456.v2019

или копия BS-123456.v2019

и т. Д. Регулярное выражение не должно ничего возвращать.

Я пробовал что-то вроде

^(?!Copy)(?<=\-)(.*?)(?=\.v)

, но, похоже, это не сработало. Я относительно новичок в регулярных выражениях, поэтому, пожалуйста, извините, если я упустил что-то очевидное. Буду признателен за любые предложения или точку в правильном направлении.

1 Ответ

3 голосов
/ 24 февраля 2020

Эта часть (?!Copy) шаблона будет выполнена успешно, но использование положительного lookbehind (?<=-) непосредственно после него не даст совпадения, потому что положительный lookahead будет сразу после начала строки утверждать, что то, что слева, должно быть -

Вместо этого вы можете использовать группу захвата:

^(?!Copy).*?-(\d{6})\.v

Regex demo

Если существует только один - перед числом можно также использовать класс отрицательных символов [^, соответствующий любому символу, кроме - или новой строки.

^(?!Copy)[^-\r\n]*-(\d{6})\.v

Regex demo

Обратите внимание , что в исходном шаблоне вы можете опустить группу захвата, чтобы получить совпадение, только если вы используете обходные пути (?<=\-).*?(?=\.v)

...