2016-08-18 22 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)。 –