Как захватить все группы, включая необязательные группы URL? - PullRequest
0 голосов
/ 10 сентября 2018

Мне нужно захватить группы следующих URL в URL-перенаправлении (IIS, web.config):

https://www.example.org/tags/1/a
https://www.example.org/tags/1/a/100
https://www.example.org/tags/2/intchars-æøå 
https://www.example.org/tags/2/test/150
https://www.example.org/tags/3/c/200

Мне нужно обнаружить:

  • метка
  • группа 1: номер (1,2,3, ...)
  • группа 2: текст (например, a, intchars-,øå, test, c)
  • группа 3: необязательный номер (100 150 200)

Мое регулярное выражение tags\/([0-9]+)\/(.*)\/?([0-9]+)?, но проблема в том, что он объединяет группы 2 и 3. Я получаю результат как:

  • группа 1: 1
  • группа 2: а / 100

вместо:

  • группа 1: 1
  • группа 2:
  • группа 3: 100

Смотрите тест здесь: https://regex101.com/r/a1uiun/1

Вот как далеко я зашел в web.config:

<rule name="Tags" stopProcessing="true">
  <match url="^tags/([0-9]+)/(.*)$" />       
  <action type="Rewrite" url="/redir/tags/{R:1}/{R:2}" appendQueryString="false" />
</rule>

https://www.example.org/tags/1/a обнаружено, но последняя группа все еще объединена.

1 Ответ

0 голосов
/ 10 сентября 2018

Измените свое регулярное выражение на:

tags\/([0-9]+)\/(.*?)(?:\/([0-9]+))?$

Regex101 demo .

Изменения в вашем регулярном выражении:

  • (.*?) Изменен квантификатор во второй группе на ленивый, чтобы он не совпадал со всем, что следует за ним.

  • (?:\/([0-9]+)) Добавили следующий слеш и цифры в группу без захвата и сделали все это необязательным.

  • В конце добавили $, чтобы убедиться, что ленивое совпадение продолжаетконец строки, если третьей группы не существует.

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