Ответ 1
/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)(/.*)?$
У меня есть URL, и я пытаюсь сопоставить его с регулярным выражением, чтобы вытащить некоторые группы. Проблема, с которой я сталкиваюсь, заключается в том, что URL-адрес может либо закончить, либо продолжить "/" и больше текста URL. Я хотел бы сопоставить URL-адреса следующим образом:
Но не подходит что-то вроде этого:
Итак, я думал, что мой лучший выбор был примерно таким:
/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)[/$]
где класс символов в конце содержал либо "/", либо конец строки. Класс символов, похоже, не радует "$". Как я могу наилучшим образом различать эти URL-адреса, сохраняя при этом правильные группы?
/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)(/.*)?$
Чтобы соответствовать либо/или концу содержимого, используйте (/|\z)
Это применимо только в том случае, если вы не используете многострочное сопоставление (т.е. вы сопоставляете один URL-адрес, а не список URL-адресов, разделенных символом новой строки).
Чтобы добавить это с обновленной версией того, что у вас было:
/(\S+?)/(\d{4}-\d{2}-\d{2})-(\d+)(/|\z)
Обратите внимание, что я изменил старт на не-жадное совпадение для не-whitespace (\S+?
) вместо того, чтобы сопоставлять что-либо и все (.*
)
Теперь у вас есть пара регулярных выражений, которые будут делать то, что вы хотите, чтобы они были адекватно покрыты. Не было указано, почему ваша попытка не будет работать: внутри класса символов $ (а также ^, ., и /) не имеет особого значения, поэтому [/$] соответствует либо буквальному /, либо литералу $ вместо завершения регулярного выражения (/) или соответствия конца строки ($).
В Ruby и Bash вы можете использовать $
внутри круглых скобок.
/(\S+?)/(\d{4}-\d{2}-\d{2})-(\d+)(/|$)
(Это решение похоже на Pete Boughton's, но сохраняет использование $
, что означает конец строки, а не использование \z
, что означает конец строки.)