2017-02-23 58 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

相关问题