如何捕获所有组,包括可选的URL组?

时间:2018-09-10 18:34:26

标签: asp.net regex url-rewriting

我需要在URL重定向(IIS,web.config)中捕获以下URL组:

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组:a / 100

代替:

  • 第1组:1
  • 第2组:a
  • 第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 :(得分:1)

将您的正则表达式更改为:

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

https://github.com/neovim/neovim/wiki/FAQ#-and-system-do-weird-things-with-interactive-processes

更改您的正则表达式:

  • (.*?)将第二组中的量词更改为懒惰的量词,以使其与之后的所有内容都不匹配。

  • (?:\/([0-9]+))将下一个斜杠和数字添加到一个非捕获组中,并使整个过程成为可选项。

  • 在末尾添加了$,以确保如果第三组不存在,惰性匹配将继续到行尾。