2017-02-23 57 views
1

正則表達式不是我的力量,我希望對此有所幫助,如果它是可能的話:如何編寫遞歸匹配RESTful路徑的正則表達式?

我需要創建遞歸匹配RESTful路徑的正則表達式。目的是創建一個與此正則表達式匹配的Symfony路由。這裏是什麼,我的意思是REST風格的路徑的一些例子:

/resources 
/resources/123 
/resources/123/children-resources 
/resources/123/children-resources/123 
/resources/123/children-resources/123/grandchildren-resources 

等等......

基本上,我想這種模式重演indefinitly一個或多個時間:

^\/[a-z]+(\-[a-z]+)*(\/[0-9]+)?$ 

請注意,要訪問子資源,父資源的標識符必須存在。

我做單元測試的短名單(兩個級別的路徑纔開始)位置: https://regex101.com/r/Hxg0m4/2/tests

我搜索同一主題的問題,但沒有一個是我的問題真的很重要。我還嘗試了一些修改上面的正則表達式 - 比如在正則表達式的末尾使用+符號,或者使用(?R) ...它從來沒有通過我的單元測試。

任何幫助將很樂意讚賞。

P.S:這是我在stackoverflow上的第一個問題,請不要猶豫,告訴我如何更好地制定我的問題。

回答

3

這個遞歸模式應該工作:

^(\/[a-z]+(?:-[a-z]+)*(?:$|\/\d+(?:$|(?1)))) 

說明:

^      // assert start of string 
(
    \/     // start with a slash 
    [a-z]+(?:-[a-z]+)* // followed by a word 
    (?:     // then, either: 
     $    // end of string 
    |     // or: 
     \/    // a slash 
     \d+    // followed by digits 
     (?:    // then, either: 
      $   // end of string 
     |    // or: 
      (?1)  // recurse the entire pattern (except the start of string anchor) 
     ) 
    ) 
) 
+0

驚人!它完成這項工作!我沒有想到「或」的條件,顯然我得到了錯誤的邏輯。感謝您的解釋,瞭解它的工作原理非常有幫助。 :) – Boulzy

相關問題