Apache2 正则表达式可选捕获组

Apache2 Regular Expression Optional Capture Group

需要帮助解决困扰我一段时间的问题!

我正在尝试创建将匹配 URL 的 Apache AliasMatch 正则表达式。我遇到的问题是我在文件匹配部分中使用捕获组作为变量 [=11=] 。本质上,我需要捕获 url 的 path/to/controller 部分以实际获取我的文件,并且我希望在双正斜杠之后不使用任何捕获组。

http://domain.com/etc/xx/abc/path/to/controller//myDesiredMVCAction

问题本质上是以下表达式:

^/etc/(xx|yy)/(abc|xyz)/(.*)(?=//)(.*)

它只匹配

http://domain.com/etc/xx/abc/path/to/controller//myDesiredMVCAction

而不是:

http://domain.com/etc/xx/abc/path/to/controller

鉴于双斜杠及其后的所有内容都是可选的。

因此,当我通过附加 ? 使正则表达式可选时,它通过包含 //myDesiredMVCAction 部分破坏了捕获组..

^/etc/(xx|yy)/(abc|xyz)/(.*)(?=//)(.*)?

有可能实现我所追求的吗?

我相信你可以使用

^/etc/(xx|yy)/(abc|xyz)/(.*?)(?://.*)?$
                        ^^^^^^^^^^^^^^^

regex demo

问题是,模式的 (.*?)(?://.*)?$ 部分的工作方式是 (.*?) 不会首先尝试,因为它是用 *? 和 [=14 延迟量化的=] 首先尝试,当后者不匹配时, (.*?) 扩展,在每个扩展步骤向组值写入一个字符。

模式匹配:

  • ^/etc/ - /etc/ 在基础 URL
  • 之后
  • (xx|yy)/ - xxyy 然后 /
  • (abc|xyz)/ - abcxyz/ 在它们之后
  • (.*?) - 任何零个或多个字符,但在第一个
  • 之前尽可能少
  • (?://.*)? -(可选组,因为末尾有 ?)两个 / 后跟任何字符,尽可能多到
  • $ - 字符串输入结束。