按任意顺序匹配可选组件

时间:2014-06-29 00:23:22

标签: regex match optional

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

2 个答案:

答案 0 :(得分:2)

捕获可以在任何一个订单中出现的两个可选组

这是一个有趣的问题,因为正如您的示例所示,type可以在sort之前发生,反之亦然。

听起来你想:

  1. 匹配所有内容
  2. 捕获类型(如果存在)
  3. 捕获排序(如果存在)
  4. (如果这不对,请告诉我,以便我可以调整正则表达式。)

    由于typesort可以按任何顺序发生,我们将使用前瞻来捕获它们:

    (?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))?