正则表达式以任意顺序匹配可选标记

Regular expression to match optional tokens in any order

本文关键字:任意 顺序 正则表达式      更新时间:2023-09-26

我正在制作一个带有令牌的URL解析器来过滤返回的结果,这些令牌是可选的,可以按任何顺序设置,我只需要在它们存在时获取参数。

我已经制作了一个可以获取令牌的正则表达式,但顺序很重要:

'/test('/page'/[0-9]+)?('/criticality'/[0-9]+)?('/order'/[a-zA-Z0-9]+)?

你可以在这里测试

在这个例子中,我会得到/page/1/order/toto/criticality/5,但临界性没有得到。

如何获得任何顺序的代币?

您可以在模式的开头用正的lookahead获取它们,并捕获lookahead中的文本,但您将列出所有可能的值组合,这些值会使正则表达式解决方案看起来很难看:

^(?=.*'/test('/page'/[0-9]+))(?=.*('/criticality'/[0-9]+))(?=.*('/order'/[a-zA-Z0-9]+))|^(?=.*'/test('/page'/[0-9]+))(?=.*('/order'/[a-zA-Z0-9]+))|^(?=.*'/test('/page'/[0-9]+))(?=.*('/criticality'/[0-9]+))|^(?=.*('/criticality'/[0-9]+))(?=.*('/order'/[a-zA-Z0-9]+))|^(?=.*('/criticality'/[0-9]+))|^(?=.*('/order'/[a-zA-Z0-9]+))|^(?=.*'/test('/page'/[0-9]+))

参见演示

正如您所看到的,regex是不可维护的。使用/分割输入字符串,然后检查数组是否包含键。如果是,您将获得键后面的元素的值。

使用交替运算符。

'/test('/page'/[0-9]+)|('/criticality'/[0-9]+)|('/order'/[a-zA-Z0-9]+)

演示

但如果以上任何一个人在场,这将是匹配的。预计三人都不会出席。