Звичайний вираз для відповідності кінцевому рядку 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} Квантор - відповідає рівно 4 рази

-відповідає символу -буквально (з урахуванням регістру)

\d{2}відповідає цифрі (дорівнює [0-9])

  • {2} Квантор - відповідає рівно 2 рази

-відповідає символу -буквально (з урахуванням регістру)

\d{2}відповідає цифрі (дорівнює [0-9])

  • {2} Квантор - відповідає рівно 2 рази

-відповідає символу -буквально (з урахуванням регістру)

3-я група захоплення (\d+)

\d+відповідає цифрі (дорівнює [0-9])

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

4-я група захоплення (.*)?

? Квантор - Відповідає від нуля до одного разу, якомога більше разів, повертаючи за необхідності (жадібний)

.*відповідає будь-якому символу (за винятком закінчувачів рядків)

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

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


126

Для відповідності будь-якому / або кінці вмісту використовуйте (/|\z)

Це стосується лише тих випадків, коли ви не використовуєте багаторядкову відповідність (тобто ви відповідаєте одній URL-адресі, а не списку URL-адрес, розділених новим рядком).


Щоб додати це до оновленої версії того, що у вас було:

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

Зверніть увагу, що я змінив початок на ненажерливий збіг для пробілів ( \S+?), а не на відповідність усьому і всьому ( .*)


6
Як я можу вам дати більше балів;) Дякую за це. Просто щоб документ (/ | \ A) відповідав косою рисою вперед або початку рядка.
Senica Gonzalez

Вітаємо з вашим новим значком Золота відповідь;) - Щойно зрозумів, що я підштовхнув вас до 100!
random_user_name

63

Зараз у вас є пара регулярних виразів, які будуть робити те, що ви хочете, тому це достатньо охоплено.

Що не було згадано, чому ваша спроба не спрацює: всередині класу символів $(а також ^,, .і /) не має особливого значення, тому [/$]відповідає або літералу, /або літералу, $а не припиняє регулярне вираження ( /) або збігу кінець рядка ( $).


8
Про це часто забувають і не згадують досить у документах щодо регулярних виразів.
Стів Данн,

6
Зверніть увагу, що ^ може мати особливе значення в класі символів. Якщо це перший символ у класі, це робить його негативним класом, який буде відповідати будь-чому, крім інших символів. наприклад, щоб зіставити будь-що, крім a або b, ви можете використовувати [^ ab]. Щоб включити літерал ^, просто переконайтеся, що він не перший, тому для відповідності а, 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
Це найбільш прямий варіант. Коса риса або кінець рядка. Це навіть відповідає назві цього запитання!
Brett Donald
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.