我有一个URL,可以包含过滤结果中使用的任何参数组合。这两个参数是类型和类型。如果网址中存在类型,则必须是文章','意见','评论'或媒体。如果URL中存在sort,则它必须是以下之一:date-desc,date-asc,views-desc,views-asc,comments-desc,comments-asc。
现在,我只使用类型和排序的URI匹配表达式。并且它不匹配既不包含params的URL也不匹配。我希望表达式匹配没有任何参数的URL和只有一个参数的URL。它还必须从nintendo,pc,playstation或xbox开始。
以下是我的示例字符串:
xbox/type:article/sort:date-desc (match)
nintendo/type:media/sort:comments-asc (match)
pc/sort:views-desc (no match)
playstation/type:opinion/ (no match)
playstation/sort:views-asc (no match)
xbox/sort:views-asc/type:article (no match)
playstation/type:media/sort:views-asc (match)
xbox (no match)
以上所有组合都需要匹配。这是我目前的表达方式:
(nintendo|pc|playstation|xbox)[\/]((type\:(article|opinion|reivew|media))[\/](sort\:(date-desc|date-asc|views-desc|views-asc|comments-desc|comments-asc)))
这是Regex101链接: http://regex101.com/r/eN0tJ5
答案 0 :(得分:2)
捕获可以在任何一个订单中出现的两个可选组
这是一个有趣的问题,因为正如您的示例所示,type
可以在sort
之前发生,反之亦然。
听起来你想:
(如果这不对,请告诉我,以便我可以调整正则表达式。)
由于type
和sort
可以按任何顺序发生,我们将使用前瞻来捕获它们:
(?m)^(?=(?:.*type:([^/\s]+))?)(?=(?:.*sort:([^/\s]+))?).*
第1组将捕获该类型,第2组将捕获该类型。
在the demo上,查看右侧窗格中的捕获组。
<强>解释强>
(?m)
启用了多行模式,允许^
和$
在每一行匹配^
锚点断言我们位于字符串的开头
The
(=(?:?*类型:([^ / \ S] +))?)lookahead allows us to capture the type, if present. It does so by asserting that
(?:类型:([^ / \ S] +)。 )may be found zero or one time. That optional content is any chars
。 , then
类型:, then
[^ / \ s] +`任何不是斜杠或空格字符的字符,即类型,通过括号捕获到第1组。(?=(?:.*sort:([^/\s]+))?)
前瞻允许我们捕获排序(如果存在)。.*
匹配整个字符串。<强>参考强>
答案 1 :(得分:0)
您可以使用?
后缀任何原子以使其成为可选项,因此您最终可能会遇到以下情况:
(nintendo|pc|...)(/type:(article|media|...))?(/sort:(date|views|comments)-(asc|desc))?