it-roy-ru.com

Regex для соответствия URL-адреса конца строки или символа "/"

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

Но не соответствует что-то вроде этого:

Итак, я думал, что моя лучшая ставка была примерно такая:

/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)[/$]

где класс символов в конце содержал либо "/", либо конец строки. Класс персонажа, похоже, не в восторге от "$". Как я могу наилучшим образом различать эти URL-адреса при одновременном отбрасывании правильных групп?

70
Chris Farmer
/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)(/.*)?$
39
Adam Tegen

Чтобы соответствовать или/или конец содержимого, используйте (/|\z)

Это применимо только в том случае, если вы не используете многострочное сопоставление (т. Е. Вы сопоставляете один URL-адрес, а не разделенный символом новой строки список URL-адресов).


Чтобы добавить это к обновленной версии того, что у вас было:

/(\S+?)/(\d{4}-\d{2}-\d{2})-(\d+)(/|\z)

Обратите внимание, что я изменил начало, чтобы оно соответствовало не жадному совпадению для непробельного пространства (\S+?), а не совпадало с чем-либо и всем (.*)

108
Peter Boughton

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

Не было упомянуто, почему ваша попытка не сработает: внутри класса символов $ (а также ^, . и /) не имеет специального значения, поэтому [/$] соответствует либо буквальному /, либо буквальному $, чем прервать регулярное выражение (/) или соответствующий конец строки ($).

55
Dave Sherohman

В Ruby и ​​Bash вы можете использовать $ в скобках.

/(\S+?)/(\d{4}-\d{2}-\d{2})-(\d+)(/|$)

(Это решение похоже на решение Пита Боутона, но сохраняет использование $, что означает конец строки, а не \z, что означает конец строки.)

16
Sparhawk