匹配任何顺序的可选组件

问题描述 投票:1回答:2

我有一个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。

regex match optional
2个回答
0
投票

你可以在任何原子后面加上 ? 使其成为可选项,所以你可以用这样的方式结束。

(nintendo|pc|...)(/type:(article|media|...))?(/sort:(date|views|comments)-(asc|desc))?

3
投票

捕获两个可选组,可以出现在任何一个顺序中

这是任何有趣的问题,因为正如你的样品所示。type 赶得及 sort 或反之亦然。

听起来你会喜欢。

  1. 匹配一切
  2. 捕获类型,如果存在的话
  3. 如果存在的话,捕捉分类

(如果这样做不对,请告诉我,以便我可以调整regex。)

由于 typesort可以以任何顺序发生,我们将使用 lookaheads 来捕获它们。

(?m)^(?=(?:.*type:([^/\s]+))?)(?=(?:.*sort:([^/\s]+))?).*

类型将被第1组捕获,排序将被第2组捕获。

演示请看右边窗格中的捕捉组。

解释

  • (?m) 打开多行模式,允许 ^$ 每行都要匹配
  • ^ 锚断了我们在字符串的开始处 (?=(?:.*type:([^/\s]+))?) lookahead允许我们捕获类型(如果存在的话)。它通过断言 (?:.*type:([^/\s]+)) 可以是零或一次。该可选内容是任何字符 .*那么 type:那么 [^/\s]+ 任何不是斜线或空格字符的字符,即类型,由括号捕获到组1。
  • 同样地 (?=(?:.*sort:([^/\s]+))?) lookahead允许我们捕捉排序,如果存在的话。
  • .* 匹配我们想要的整个字符串。

参考

© www.soinside.com 2019 - 2024. All rights reserved.