RegEx для сопоставления нескольких шаблонов URL с Javascript - PullRequest
2 голосов
/ 01 ноября 2019

Я пытаюсь сопоставить любой из нескольких шаблонов URL в Javascript. Шаблоны:

  • Домашняя страница - / без чего-либо после.
  • Одна из трех страниц решений. За каждым solutions(number) может следовать / и любые символы после.
    • /solutions/99043 или /solutions/99043/blah
    • /solutions/60009 или /solutions/60009/blah
    • /solutions/40117 или /solutions/40117/blah
  • Поиск: /search, за которым следуют любые символы, например ?blah.

RegEx, который я пробовал, выглядит следующим образом:

/\/$|\/solutions\/(99043|60009|40117)\/.*|\/search.*/

В этой функции:

(function () {
    const urlPath = window.location.pathname;
    if (urlPath.match(/\/$|\/solutions\/(99043|60009|40117)\/.*|\/search.*/)) {
        console.log("urlPath", urlPath);
    }
})()

Это не работает, потому что все, кажется, совпадает. У кого-нибудь есть идеи, где я ошибся?

На основе комментария приведен пример URL, который соответствует, но не должен: /solutions/

Ответы [ 4 ]

2 голосов
/ 01 ноября 2019

Вы можете из якорей утверждать, что начало ^ и конец $ строки.

Совпадение / и, при необходимости, сопоставление либо части с решениями, за которыми следуют 3 числа, либо совпадение споиск части с использованием чередования .

^\/(?:solutions\/(?:99043|60009|40117)(?:\/.*)?|search\b.*)?$
  • ^ Начало строки
  • \/ Соответствие /
  • (?: Группа без захвата
    • solutions\/ Совпадение solutions/
    • (?:99043|60009|40117) Совпадение 1 из 3 чисел
    • (?:\/.*)? По выбору совпадение / и любой символкроме новой строки 0+ раз
    • | или
    • search\b.* Поиск совпадения, за которым следует граница слова, чтобы не совпасть, например searchhere
  • )? Закрыть группу без захвата и сделать ее необязательной
  • $ Конец строки

Regex demo

2 голосов
/ 01 ноября 2019

Если вы извлекаете путь из URL и затем выполняете сопоставление, я бы рекомендовал использовать ^\/$ вместо простого сопоставления «заканчивается косой чертой».

Так что это будет ^\/$|\/solutions\/(99043|60009|40117)\/.*|\/search.*

Вы можете проверить это на regex101.com. Я обнаружил, что regulex действительно полезен для визуализации регулярных выражений.

1 голос
/ 01 ноября 2019

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

^\/((solutions(\/(99043|60009|40117)(\/.*)?)?)|search(.*)?)$

Тест:

var regex = /^\/((solutions(\/(99043|60009|40117)?(\/.*)?)?)|search(.*)?)?$/

console.log(1, regex.test('/')) // true

console.log(2, regex.test('/solutions')) // true
console.log(3, regex.test('/solutions/')) // true

console.log(4, regex.test('/solutions/99043')) // true
console.log(5, regex.test('/solutions/99043/')) // true
console.log(6, regex.test('/solutions/99043/anything')) // true

console.log(7, regex.test('/solutions/60009')) // true
console.log(8, regex.test('/solutions/60009/')) // true
console.log(9, regex.test('/solutions/60009/anything')) // true

console.log(10, regex.test('/solutions/40117')) // true
console.log(11, regex.test('/solutions/40117/')) // true
console.log(12, regex.test('/solutions/40117/anything')) // true

console.log(13, regex.test('/solutions/00000')) // false
console.log(14, regex.test('/solutions/00000/')) // false
console.log(15, regex.test('/solutions/00000/anything')) // false

console.log(16, regex.test('/bug')) // false

console.log(17, regex.test('/search?query=javascript')) // true
console.log(18, regex.test('/search/?query=javascript')) // true

Таким образом, это регулярное выражение предотвращает следующие ошибки:

  • Предотвращает проверку подстроки, а не полнойпуть:

/bug/solutions/99043 // false

  • Предотвращает тестирование только части чисел решений:

/solutions/990430000 // false

/solutions/000099043 // false

0 голосов
/ 01 ноября 2019
\/(solutions|search)(\/(99043|60009|40117).*|)

https://regex101.com/r/nqtB4v/2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...