正则表达式(?:)的奇怪行为
本文关键字:正则表达式 | 更新日期: 2024-10-30 15:40:29
在下面的相对网址中,我想获取可选的 origin 参数,但我只需要 origin 本身(这将在以下 url 中进行测试,而不是使用-test-origin)
/somequery/with-test-origin/param/param/more
当我使用此正则表达式时,url 匹配:
([^/]+)/(?:(?:with-)([^/]*)(-origin)/)?([^/]*/)?([^/]*/)?more
但当我使用它时不会:
([^/]+)/(?:(?:with-)([^/]*)(?:-origin)/)?([^/]*/)?([^/]*/)?more
问题出在哪里? 为什么当我不想捕获 (-origin) 组时它不起作用?
编辑:
我在应用程序中对其进行了测试,它运行良好。我也在web.config中尝试过这个:
([^/]+)/(?:(with-)([^/]*)(?:-origin)/)?([^/]*/)?([^/]*/)?more
在 web.config 中(从 (?:with-) 中删除 ?: 并将其放回 (?:-oRigin),它也在web.config中工作。web.config 文件中对我不想捕获的组或组的数量是否有限制?
这是我在我的 web.config 文件中使用它的方式:
<rule name="tst" enabled="true" stopProcessing="true">
<match url="([^/]+)/(?:(?:with-)([^/]*)(?:-origin)/)?([^/]*/)?([^/]*/)?more" />
<action type="Rewrite" url="moreinfo.aspx?cat={R:1}&sub1={R:2}&sub2={R:3}&sub3={R:4}&sub4={R:5}" />
</rule>
匹配行为不应基于此差异而更改。 问题在于:
- 您的 web.config 文件中的其他内容。
- 正则表达式引擎或 web.config 中的错误。
经过几个小时的挣扎,我终于找到了问题所在。
匹配项从零开始,类似于 {R:0} {R:1} , ...使用 ?: 时,匹配数减少了 1,例如,在添加 ?: 之前有效的 {R:1} 变为无效。