2016-08-18 20 views
1

需要帮助,一直困扰我一段时间的问题!Apache2正则表达式可选捕获组

我正在尝试创建一个Apache AliasMatch正则表达式,它将匹配一个URL。我遇到的问题是我使用捕获组作为文件匹配部分内的变量$0 $1 $2。本质上我需要捕获url的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

鉴于双斜杠,一切尾随它是可选的。

所以,当我做正则表达式表达式可选附加一个?它破坏由包括//myDesiredMVCAction部分捕获组..

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

这是可能实现我后?

回答

1

我相信你可以使用

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

regex demo

的事情是,该模式的(.*?)(?://.*)?$部分以这样的方式工作是(.*?)不是第一次尝试,因为它懒洋洋地用量化*?(?://.*)?$首先被尝试,当后者不匹配时,(.*?)将扩展,在每个扩展步骤将字符写入组值。

的模式匹配:

^/etc/
  • - xxyy然后/
  • (abc|xyz)/ - - /etc/基本URL
  • (xx|yy)/abcxyz/后他们
  • (.*?) - 任何零个或多个字符,但尽可能少第一
  • (?://.*)?前 - (末尾可选的组由于?)2 /秒,然后用任何字符,尽可能多的高达
  • $ - 字符串输入的端。
+0

谢谢@Wiktor!似乎贪婪的量化与我的思维过程不相似。学到了一些新的事物:IQ + 1;) – xRavisher

+1

懒惰和贪婪的量词在一起使用时很难理解。我建议你看看[*我可以进一步提高此正则表达式的性能*](http://stackoverflow.com/questions/33869557/can-i-improve-performance-of-this-regular-expression-further/33869801#33869801)。 –