Apache2正则表达式可选捕获组

时间:2016-08-18 06:19:30

标签: regex apache2

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

我正在尝试创建一个与URL匹配的Apache AliasMatch正则表达式。我遇到的问题是我在文件匹配部分中使用捕获组作为变量$0 $1 $2。基本上我需要捕获网址的path/to/controller部分以实际抓取我的文件,我希望在包含双正斜杠后不使用任何捕获组。

http://domain.com/etc/xx/abc/路径/到/控制器 // 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

鉴于双斜杠和尾随它的所有内容都是可选的。

因此,当我通过附加?使regex表达式成为可选时,它会通过包含//myDesiredMVCAction部分来破坏捕获组。

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

有可能实现我之后的目标吗?

1 个答案:

答案 0 :(得分:1)

我相信你可以使用

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

请参阅regex demo

问题是,该模式的(.*?)(?://.*)?$部分的工作原理是(.*?)不首先尝试,因为它是*?(?://.*)?$的懒惰量化首先尝试,当后者不匹配时,(.*?)展开,在每个扩展步骤中将字符写入组值。

模式匹配:

    基本网址后面的
  • ^/etc/ - /etc/
  • (xx|yy)/ - xxyy,然后是/
  • (abc|xyz)/ - abcxyz以及/之后
  • (.*?) - 任何零个或多个字符,但在第一个
  • 之前尽可能少
  • (?://.*)? - (最后?引用的可选组)两个/后跟任意字符,最多可达
  • $ - 字符串输入的结尾。