Регулярное выражение для сопоставления пути, содержащего одну из двух строк

#regex #alternation

Вопрос:

Регулярное выражение для сопоставления одной из двух строк в третьем сегменте, т. е. в псевдо-коде:

 /content/au/(boomer or millenial)/...
 

Примеры совпадений

 /content/au/boomer 
/content/au/boomer/male/31 
/content/au/millenial/female/29/M 
/content/au/millenial/male/18/UM
 

Примеры несоответствий

 /content/au
/content/nz/millenial/male/18/UM
/content/au/genz/male
 

Я пробовал это, но безрезультатно:

 ^/content/au/(?![^/]*/(?:millenial|boomer))([^/]*)
 

Ответ №1:

Не смотрите вперед; просто используйте простое чередование millenial|boomer , а затем границу слов:

 ^/content/au/(?:millenial|boomer)b(?:/.*)?
 

Смотрите живую демонстрацию.

Вам, вероятно, тоже следует правильно писать millennial (два «n», а не одно).

Комментарии:

1. Значение b не совсем строгое; оно все равно будет совпадать с millenial.com или boomer*x .

2. @tripleee, конечно , вы могли бы поменять b (?=/|$) местами, но b это работает для всех случаев ОП, и также нужно учитывать читаемость.

Ответ №2:

Что с отрицательной внешностью? Это простое, если не тривиальное, положительное совпадение.

 ^/content/au/(?:millenial|boomer)(?:/|$)
 

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

Ответ №3:

Вы можете использовать следующую демонстрацию регулярных выражений

 content/au/(?:boomer|millenial)
 

введите описание изображения здесь