我有一个URL,可以包含用于过滤结果的参数的任意组合。 这两个参数是类型和排序。 如果类型存在于URL中,它必须是 "文章"、"观点"、"评论 "或 "媒体"。 如果URL中存在排序,它必须是以下之一:日期-desc、日期-asc、观点-desc、观点-asc、评论-desc、评论-asc。
现在,我的表达式只匹配类型和排序的URI。 而且它不匹配包含这两个参数的 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.comreN0tJ5。
你可以在任何原子后面加上 ?
使其成为可选项,所以你可以用这样的方式结束。
(nintendo|pc|...)(/type:(article|media|...))?(/sort:(date|views|comments)-(asc|desc))?
捕获两个可选组,可以出现在任何一个顺序中
这是任何有趣的问题,因为正如你的样品所示。type
赶得及 sort
或反之亦然。
听起来你会喜欢。
(如果这样做不对,请告诉我,以便我可以调整regex。)
由于 type
和 sort
可以以任何顺序发生,我们将使用 lookaheads 来捕获它们。
(?m)^(?=(?:.*type:([^/\s]+))?)(?=(?:.*sort:([^/\s]+))?).*
类型将被第1组捕获,排序将被第2组捕获。
在 演示请看右边窗格中的捕捉组。
解释
(?m)
打开多行模式,允许 ^
和 $
每行都要匹配^
锚断了我们在字符串的开始处 (?=(?:.*type:([^/\s]+))?)
lookahead允许我们捕获类型(如果存在的话)。它通过断言 (?:.*type:([^/\s]+))
可以是零或一次。该可选内容是任何字符 .*
那么 type:
那么 [^/\s]+
任何不是斜线或空格字符的字符,即类型,由括号捕获到组1。(?=(?:.*sort:([^/\s]+))?)
lookahead允许我们捕捉排序,如果存在的话。.*
匹配我们想要的整个字符串。参考