【问题标题】:strange behavior of regex (?:)正则表达式的奇怪行为(?:)
【发布时间】:2015-03-07 22:27:49
【问题描述】:

在下面的相对网址中,我想获取可选的原点参数,但我只需要原点本身(以下网址中的 test 不是 with-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>

【问题讨论】:

  • regex101.com/r/xW8kZ0/2它正在工作。
  • @AvinashRaj 我在 web.config 文件中使用它来重写 url,它在那里不起作用
  • 错误信息是什么?它抛出异常,说没有匹配?
  • 我认为您需要将所有捕获组转换为非捕获组,而不是持有测试的组regex101.com/r/xW8kZ0/3
  • @George 当我省略 ?: from (?:-origin) 时它会重写 url,否则它会显示常见的错误页面,该页面总是在 url 不匹配时显示

标签: c# regex url-rewriting


【解决方案1】:

匹配行为不应该基于这种差异而改变。问题是:

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

【讨论】:

  • 因为我已经清除了所有 web.config,所以第一个不是这种情况,在我的网页中我使用 Regex.Match 对其进行了测试,它也可以正常工作,所以我认为 regex 引擎中的错误不会也是这样。我也在查看 web.config 中的正则表达式是否存在限制。我解决了获取所有组的问题,但忽略了我不需要的组,但我真的很好奇这里的问题是什么
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 2013-07-13
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多