如何编写递归匹配 RESTful 路径的正则表达式?
How can I write a regexp that recursively matches RESTful path?
正则表达式不是我的强项,我希望在这方面得到一些帮助,如果可能的话:
我需要创建一个递归匹配 RESTful 路径的正则表达式。目的是创建一个匹配这个正则表达式的 Symfony 路由。以下是我所说的 RESTful 路径的一些示例:
/resources
/resources/123
/resources/123/children-resources
/resources/123/children-resources/123
/resources/123/children-resources/123/grandchildren-resources
等等...
基本上,我希望这种模式无限地重复自己一次或多次:
^\/[a-z]+(\-[a-z]+)*(\/[0-9]+)?$
请注意,要访问子资源,必须存在父资源的标识符。
我在这里列出了一个简短的单元测试列表(仅用于两级路径):
https://regex101.com/r/Hxg0m4/2/tests
我搜索了关于同一主题的问题,但 none 确实与我的问题相关。我还尝试对上面的正则表达式进行一些修改——比如在正则表达式末尾使用 +
符号,或者使用 (?R)
...它从未通过我的单元测试。
任何帮助将不胜感激。
P.S:这是我关于 Whosebug 的第一个问题,请不要犹豫告诉我如何更好地表达我的问题。
这个递归模式应该有效:
^(\/[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)
)
)
)
正则表达式不是我的强项,我希望在这方面得到一些帮助,如果可能的话:
我需要创建一个递归匹配 RESTful 路径的正则表达式。目的是创建一个匹配这个正则表达式的 Symfony 路由。以下是我所说的 RESTful 路径的一些示例:
/resources
/resources/123
/resources/123/children-resources
/resources/123/children-resources/123
/resources/123/children-resources/123/grandchildren-resources
等等...
基本上,我希望这种模式无限地重复自己一次或多次:
^\/[a-z]+(\-[a-z]+)*(\/[0-9]+)?$
请注意,要访问子资源,必须存在父资源的标识符。
我在这里列出了一个简短的单元测试列表(仅用于两级路径): https://regex101.com/r/Hxg0m4/2/tests
我搜索了关于同一主题的问题,但 none 确实与我的问题相关。我还尝试对上面的正则表达式进行一些修改——比如在正则表达式末尾使用 +
符号,或者使用 (?R)
...它从未通过我的单元测试。
任何帮助将不胜感激。
P.S:这是我关于 Whosebug 的第一个问题,请不要犹豫告诉我如何更好地表达我的问题。
这个递归模式应该有效:
^(\/[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)
)
)
)