Игнорирование слова в регулярном выражении (отрицательный просмотр вперед) - PullRequest
1 голос
/ 04 августа 2020

Я пытаюсь игнорировать слово в регулярном выражении, но решения, которые я видел здесь, не работали для меня.

Регулярное выражение для соответствия строке, которая не содержать слово

Проблема, с которой я столкнулся, заключается в том, что у меня есть существующее регулярное выражение:

(?P<MovieCode>[A-Za-z]{3,6}-\d{3,5})(?P<MoviePart>[A-C]{1}\b)?

Это соответствует Deku-041114-575- boku.mp4.

Однако я хочу, чтобы это регулярное выражение не соответствовало случаям, когда в группе MovieCode есть Deku.

Я пробовал (?P<MovieCode>(?!Deku)[A-Za-z]{3,6}-\d{3,5})(?P<MoviePart>[A-C]{1}\b)?, но, к сожалению, он просто соответствует eku-124 и мне нужно, чтобы он потерпел неудачу.

У меня есть regex101 с моими попытками. https://regex101.com/r/xqALM2/2

1 Ответ

1 голос
/ 04 августа 2020

Группа MovieClose может соответствовать 3-6 символам AZ, а Deku имеет 4 символа. Если эта часть не должна содержать Deku, вы можете использовать отрицательный прогноз, предопределенный повторением 0+ раз класса символов [A-Za-z]*, поскольку он не может пересекать -.

Чтобы предотвратить совпадение eku-124, вы можно добавить границу слова перед группой MovieClose или добавить (?<!\S, если должна быть граница пробела слева.

Обратите внимание, что вы можете опустить {1} в шаблоне.

\b(?P<MovieCode>(?![A-Za-z]*Deku)[A-Za-z]{3,6}-\d{3,5})(?P<MoviePart>[A-C]\b)?

Демо Regex

...