Регулярное выражение для проверки пути URI с помощью подстановочного знака

#regex #regex-group

Вопрос:

Я пытаюсь проверить введенный путь URI с помощью шаблона подстановочных знаков в виде звездочек одинарной(*) или двойной (**). Например: /path1/*/path2/ или /path1/path2/**/path3

Я придумал регулярное ^(?:/w /?|/*/?|/**/?) $ выражение, которое соответствует всем допустимым путям из списка ниже, за исключением: /foo* и /foo** и не соответствует недопустимому, за исключением одного /foo//bar

Не могли бы вы предложить лучшее регулярное выражение для всех случаев и, возможно, более оптимизированное, чем мое.

https://regex101.com/r/U65utY/1

Учитывая допустимый путь, такой как:

  • /фу/бар
  • /фу/бар/
  • /*
  • /фу/*
  • /фу/*/бар
  • /фу*
  • /**
  • /фу**
  • /фу/**
  • /фу/**/бар

и недопустимый путь, такой как:

  • фу
  • фу/бар
  • //фу
  • /фу//бар
  • /фу/***/бар
  • /***

Комментарии:

1. Попробуйте ^(?:/(?:*{1,2}|w *{0,2})) /?$ , посмотрите демонстрацию

2. Или ^(?:/(?!/)w**{0,2}) $

3. Небольшое примечание: вам не нужно избегать косых черт вперед — они не имеют особого значения. т. е. ваше регулярное ^(?:/w /?|/*/?|/**/?) $ выражение идентично ^(?:/w /?|/*/?|/**/?) $ . Хотя некоторые языки/инструменты разделяют регулярное выражение косыми чертами, это не делает экранирование косых черт, требуемое в этом контексте, частью регулярного выражения.

Ответ №1:

Вы можете использовать

 ^(?:/(?:*{1,2}|w *{0,2})) /?$
 

Смотрите демонстрацию регулярных выражений

Подробные сведения

  • ^ — начало строки
  • (?:/(?:*{1,2}|w *{0,2})) — одно или несколько случаев
    • / — а / чар
    • (?:*{1,2}|w *{0,2}) — одна из альтернатив:
      • *{1,2}| — одна или две звездочки, или
      • w *{0,2} — один или несколько символов слова, а затем ноль, одна или две звездочки
  • /? — необязательный /
  • $ — конец веревки.