Regex Apache2正则表达式可选捕获组

Regex Apache2正则表达式可选捕获组,regex,apache2,Regex,Apache2,需要帮助解决困扰我一段时间的问题 我正在尝试创建一个ApacheAliasMatch正则表达式来匹配URL。我遇到的问题是,我将捕获组用作文件匹配部分中的变量$0$1$2。基本上,我需要捕获url的路径/to/controller部分才能真正抓取我的文件,我不希望在包含双正斜杠之后使用任何捕获组 路径/to/controller//MyDesiredMVAction 问题的实质是,使用以下表达式: ^/etc/(xx | yy)/(abc | xyz)/(*)(?=/)(*) 它只匹配 http

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

我正在尝试创建一个Apache
AliasMatch
正则表达式来匹配URL。我遇到的问题是,我将捕获组用作文件匹配部分中的变量
$0$1$2
。基本上,我需要捕获url的
路径/to/controller
部分才能真正抓取我的文件,我不希望在包含双正斜杠之后使用任何捕获组

路径/to/controller//MyDesiredMVAction

问题的实质是,使用以下表达式:

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

它只匹配

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

而不是:

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

考虑到双斜杠和后面的所有内容,它是可选的

因此,当我通过附加一个
使正则表达式成为可选表达式时,它通过包含
//myDesiredMVAction
部分破坏了捕获组

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

有可能实现我的目标吗?

我相信你可以使用

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

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

模式匹配:

  • ^/etc/
    -
    /etc/
    在基本URL之后
  • (xx | yy)/
    -
    xx
    yy
    然后是a
    /
  • (abc | xyz)/
    -一个
    abc
    xyz
    和它们后面的一个
    /
  • (.*)
    -任何零个或多个字符,但在第一个字符之前尽可能少
  • (?:/.*)
    -(由于末尾的
    而为可选组)两个
    /
    后跟任意字符,尽可能多至
  • $
    -字符串输入的结尾

谢谢@Wiktor!似乎贪婪的量化与我的思维过程并不相似。。今天学到了一些新东西:智商+1;)懒惰和贪婪的量词在一起使用时是如何工作的很难理解。我建议你看看。