Регулярное выражение для соответствия конца строки URL или символа «/»

80

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

Но не совпадать примерно так:

Итак, я подумал, что лучше всего будет что-то вроде этого:

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

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

Крис Фармер
источник

Ответы:

41
/(.+)/(\d{4}-\d{2}-\d{2})-(\d+)(/.*)?$

1-я группа захвата (.+)

.+ соответствует любому символу (кроме символов конца строки)

  • + Квантификатор - соответствует от одного до неограниченного количества раз, столько раз, сколько возможно, отдача по мере необходимости (жадный)

2-я группа захвата (\d{4}-\d{2}-\d{2})

\d{4}соответствует цифре (равно [0-9])

  • {4} Quantifier - соответствует ровно 4 раза

--буквально соответствует символу (с учетом регистра)

\d{2}соответствует цифре (равно [0-9])

  • {2} Quantifier - соответствует ровно 2 раза

--буквально соответствует символу (с учетом регистра)

\d{2}соответствует цифре (равно [0-9])

  • {2} Quantifier - соответствует ровно 2 раза

--буквально соответствует символу (с учетом регистра)

3-я группа захвата (\d+)

\d+соответствует цифре (равно [0-9])

  • + Квантификатор - соответствует от одного до неограниченного количества раз, столько раз, сколько возможно, отдача по мере необходимости (жадный)

4-я группа захвата (.*)?

? Квантификатор - соответствует от нуля до единицы , столько раз, сколько возможно, отдача по мере необходимости (жадность)

.*соответствует любому символу (кроме символов конца строки)

  • * Квантификатор - совпадение от нуля до неограниченного числа раз, максимальное количество раз, отдача по мере необходимости (жадность)

$ утверждает позицию в конце строки

Адам Теген
источник
126

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

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


Чтобы использовать обновленную версию того, что у вас было:

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

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

Питер Ботон
источник
6
Как мне дать вам больше очков;) Спасибо за это. Просто чтобы документ (/ | \ A) соответствовал бы косой черте или началу строки.
Сеника Гонсалес
Поздравляю с получением нового значка Gold Answer;) - Только что понял, что подтолкнул вас к 100!
random_user_name
63

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

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

Дэйв Шерохман
источник
8
Это то, о чем часто забывают и о чем не упоминают в документации по регулярным выражениям.
Стив Данн,
6
Обратите внимание, что ^ может иметь особое значение в классе символов. Если это первый символ в классе, это делает его отрицательным классом, который будет соответствовать чему-либо, кроме других символов. например, чтобы соответствовать чему-либо, кроме a или b, вы можете использовать [^ ab]. Чтобы включить литерал ^, просто убедитесь, что он не является первым, поэтому для соответствия a, b или ^ вы должны использовать [ab ^].
Дэвид Мейсон
18

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

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

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

Спархок
источник
2
PHP тоже, насколько я могу судить. Я не вижу причин, по которым $нельзя использовать скобки ()в какой-либо реализации. Это скобки []делают его буквальным.
Джоэл Меллон
3
$работает таким образом в javascript, тогда как \zнет (Chrome 48, Firefox 43, IE9).
Всеволод Голованов
1
Это самый простой вариант. Сопоставьте косую черту или конец строки. Это даже соответствует названию этого вопроса!
Бретт Дональд