Regex 按任意顺序匹配可选组件
我有一个URL,可以包含过滤结果中使用的任何参数组合。这两个参数是type和sort。如果URL中存在类型,则必须是“文章”、“意见”、“评论”或“媒体”。如果URL中存在排序,则排序必须是以下内容之一:日期描述、日期asc、视图描述、视图asc、注释描述、注释asc 现在,我的表达式只匹配URI的类型和排序。它与包含两个参数的URL都不匹配。我希望表达式匹配没有任何参数的URL和只有一个参数的URL。它还必须从任天堂、pc、playstation或xbox开始 以下是我的示例字符串:Regex 按任意顺序匹配可选组件,regex,match,optional,Regex,Match,Optional,我有一个URL,可以包含过滤结果中使用的任何参数组合。这两个参数是type和sort。如果URL中存在类型,则必须是“文章”、“意见”、“评论”或“媒体”。如果URL中存在排序,则排序必须是以下内容之一:日期描述、日期asc、视图描述、视图asc、注释描述、注释asc 现在,我的表达式只匹配URI的类型和排序。它与包含两个参数的URL都不匹配。我希望表达式匹配没有任何参数的URL和只有一个参数的URL。它还必须从任天堂、pc、playstation或xbox开始 以下是我的示例字符串: 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]+)
,然后*
,然后类型:
非斜杠或空白字符的任何字符,即括号捕捉到组1的类型[^/\s]+
- 同样地,
lookahead允许我们捕获排序(如果存在)(?=(?:.*sort:([^/\s]+)?)
按照我们的要求匹配整个字符串*
参考