Regex 按任意顺序匹配可选组件

Regex 按任意顺序匹配可选组件,regex,match,optional,Regex,Match,Optional,我有一个URL,可以包含过滤结果中使用的任何参数组合。这两个参数是type和sort。如果URL中存在类型,则必须是“文章”、“意见”、“评论”或“媒体”。如果URL中存在排序,则排序必须是以下内容之一:日期描述、日期asc、视图描述、视图asc、注释描述、注释asc 现在,我的表达式只匹配URI的类型和排序。它与包含两个参数的URL都不匹配。我希望表达式匹配没有任何参数的URL和只有一个参数的URL。它还必须从任天堂、pc、playstation或xbox开始 以下是我的示例字符串: xbox

我有一个URL,可以包含过滤结果中使用的任何参数组合。这两个参数是type和sort。如果URL中存在类型,则必须是“文章”、“意见”、“评论”或“媒体”。如果URL中存在排序,则排序必须是以下内容之一:日期描述、日期asc、视图描述、视图asc、注释描述、注释asc

现在,我的表达式只匹配URI的类型和排序。它与包含两个参数的URL都不匹配。我希望表达式匹配没有任何参数的URL和只有一个参数的URL。它还必须从任天堂、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链接:

您可以在任何原子后面加上
使其成为可选的,这样您就可以得到如下结果:

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

捕获两个可按任意顺序出现的可选组

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

听起来你想:

  • 匹配一切
  • 捕获类型(如果存在)
  • 捕获排序(如果存在)
  • (如果这不正确,请告诉我,以便调整正则表达式。)

    由于
    type
    sort
    可以按任何顺序发生,因此我们将使用lookaheads来捕获它们:

    (?m)^(?=(?:.*type:([^/\s]+))?)(?=(?:.*sort:([^/\s]+))?).*
    
    类型将由组1捕获,排序将由组2捕获

    在上,查看右侧窗格中的捕获组

    解释

    • (?m)
      打开多行模式,允许
      ^
      $
      在每行上匹配
    • ^
      锚定声明我们位于字符串的开头
      (?=(?:.*type:([^/\s]+))
      前瞻允许我们捕获类型(如果存在)。它通过断言
      (?:.*type:([^/\s]+)
      可能被发现零次或一次来实现。该可选内容是任何字符
      *
      ,然后
      类型:
      ,然后
      [^/\s]+
      非斜杠或空白字符的任何字符,即括号捕捉到组1的类型
    • 同样地,
      (?=(?:.*sort:([^/\s]+)?)
      lookahead允许我们捕获排序(如果存在)
    • *
      按照我们的要求匹配整个字符串

    参考

    很好的解释:)根据我的需要进行了修改!