Regex не соответствует первой альтернативе - PullRequest
0 голосов
/ 14 января 2019

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

Вот что я использую:

^.*\b((?i)foxtrot movie|whiskey|whiskeyfoxtrotmovie)\b.*$

Это прекрасно работает для других версий имени учетной записи в данных, в первую очередь "Foxtrot Movie". Но теперь я хочу, чтобы он снял «Фильм о виски Фокстрот» и «Фильм Фокстрот».

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

Я знаю, что Regex стремится, и поэтому, чтобы поощрить сравнение с большей строкой, сначала я скорректировал выражение в пределах границы, чтобы \b((?i)whiskeyfoxtrotmovie|whiskey foxtrot movie|whiskey|foxtrot movie)\b, но он захватывает только «Фокстрот Фильм» даже для более длинной строки. Я не могу понять, почему это не совпадает со второй альтернативой, чтобы захватить "Виски Фокстрот Фильм"

(whiskey)? foxtrot movie приводит к той же ошибке. Перемещение порядка, похоже, тоже не помогает. Включение каждой альтернативы в () также проваливает меня.

Я все еще новичок в этом, так что, может быть, есть что-то, чего я не понимаю в границах? Но это работает до тех пор, пока у меня в выражении одновременно нет whiskey foxtrot movie и foxtrot movie. Может пробелы?

Любое понимание приветствуется.

1 Ответ

0 голосов
/ 15 января 2019

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

Если вам нужно сопоставить всю строку, замените первое .* на .*?, но имеет больше смысла использовать метод, который разрешает частичное совпадение, и просто используйте

(?i)\b(whiskeyfoxtrotmovie|whiskey foxtrot movie|whiskey|foxtrot movie)\b

См. Демоверсию regex .

То есть удалите ^ и $ якоря и включающие .* шаблоны.

...