Регулярное выражение для соответствия базовому пути - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь получить регулярное выражение, соответствующее определенному базовому пути.Правило должно соответствовать самому базовому пути плюс "/" или "."и остальная часть пути.

например, учитывая / api / ping, следующее должно соответствовать

/api/ping.json
/api/ping
/api/ping/xxx/sss.json
/api/ping.xml

, и это НЕ должно совпадать

/api/pingpong
/api/ping_pong
/api/ping-pong

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

/api/ping[[\.|\/].*]?

Но, похоже, он не уловил /api/ping случай

Вот ссылка на регулярное тестирование штормового тестера

-

обновление: благодаря ответам, теперь у меня есть эта версия, которая лучше отражает мои рассуждения:

\/api\/ping(?:$|[.\/?]\S*)

Выражение либо заканчивается после пинга (это $ part) или продолжает с ., / или ?, за которыми следуют любые непробельные символы

, вот регулярное выражение

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

В вашем шаблоне используется класс символов , который будет соответствовать любому из перечисленных, который также может быть записан как [[./|].

Не соответствует /api/ping, поскольку класс символов должен совпадать как минимум 1 раз, поскольку это не является обязательным.

Вы можете использовать чередование для сопоставления/api/ping с последующим подтверждением конца строки или | соответствуют структуре, повторяя 0 или более раз, совпадая с косой чертой, за которой следует не прямая косая черта, за которой следуют точка и 1+ раз, а затем точка и расширение.

/api/ping(?:(?:/[^/\s]+)*\.\S+|$)

Это будет соответствовать

  • /api/ping Соответствовать буквально
  • (?: Группа без захвата
    • (?:/[^/\s]+)* Повторить группировкуструктура 0+ раз совпадение /, затем 1+ раз не / или символ пробела
    • \.\S+ Совпадение с точкой и 1+ раз символ без пробела
    • | Или
    • $ Утверждение конца строки
  • ) Закрыть группу без захвата

См. Демонстрационное выражение regex | C # демо

0 голосов
/ 02 февраля 2019

Вы можете использовать это регулярное выражение, которое использует чередования, чтобы гарантировать, что за базовым путем следует либо . или /, либо конец строки $

\/api\/ping(?=\.|\/|$)\S*

Объяснение:

  • \/api\/ping - Соответствует /api/ping тексту буквально
  • (?=\.|\/|$) - смотрите вперед, следуя либо буквальной точке ., либо слешу /или конец строки $
  • \S* - по желанию следует за любым непробельным символом, следующим за путем

Демо

В вашем регулярном выражении /api/ping[[\.|\/].*]? использование набора символов [] является неправильным, когда вам не нужно экранировать точку ., а чередование | не требуется в наборе символов иневозможно сделать, поместив | в класс символов, а также, поскольку класс символов выглядит вложенным, это не требуется и не является правильным решением.Я думаю, вы хотели сделать свое регулярное выражение примерно таким,

\/api\/ping([.\/].*)?$

Демо с исправленным регулярным выражением

Обратите внимание, как только вы разместите что-нибудьв [] тогда он считается только одним символом, разрешающим все, что содержится в наборе символов, следовательно, он допускает либо точку ., либо косую черту / и замечает, что вам нужно экранировать / как \/

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