正则表达式(?:)的奇怪行为

本文关键字:正则表达式 | 更新日期: 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}&amp;sub1={R:2}&amp;sub2={R:3}&amp;sub3={R:4}&amp;sub4={R:5}" />
        </rule>

正则表达式(?:)的奇怪行为

匹配行为不应基于此差异而更改。 问题在于:

  • 您的 web.config 文件中的其他内容。
  • 正则表达式引擎或 web.config 中的错误。

经过几个小时的挣扎,我终于找到了问题所在。

匹配项从零开始,类似于 {R:0} {R:1} , ...使用 ?: 时,匹配数减少了 1,例如,在添加 : 之前有效的 {R1} 变为无效。