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

时间:2015-03-07 06:44:45

标签: c# regex url-rewriting

在下面的相对url中我想得到可选的origin参数但是我只需要原点本身(在以下url中 test 而不是 with-test-origin

/somequery/with-test-origin/param/param/more

当我使用这个正则表达式时,url会匹配:

([^/]+)/(?:(?:with-)([^/]*)(-origin)/)?([^/]*/)?([^/]*/)?more

但不是在我使用它时:

([^/]+)/(?:(?:with-)([^/]*)(?:-origin)/)?([^/]*/)?([^/]*/)?more

有什么问题?当我不想抓住( - 原创)组时,为什么它不起作用?

修改

我在一个应用程序中测试它运行正常。我也在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>

2 个答案:

答案 0 :(得分:0)

匹配行为不应根据此差异进行更改。问题是:

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

答案 1 :(得分:0)

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

匹配是基于零的,就像{R:0} {R:1},... 当使用?:时,匹配数减少了1,例如在添加?:之前有效的{R:1}变为无效。