假设我们有以下字符串:
1|order=asc|type=1
我们需要创建正则表达式,将其解析为参数,假设字符串始终以数字开头,并且(可选)具有任何顺序的参数(顺序,asc)。它也可能有 3 个或更多参数,但为了简单起见,我们在这里保留 2 个。 例如,这些是正则表达式会理解的字符串:
1
1|order=asc|type=1
1|type=1|order=asc
我有以下表达式来完成这项工作:
(?<id>^\w+)((?:\|type=(?<type>\w+))|(?:\|order=(?<order>\w+))){0,2}
这是我的正则表达式的 demo 链接
但问题是它允许重复。
如果我们有以下字符串,它将根本不匹配 order
参数:
1|type=1|type=2|order=asc
理想情况下,我们应该从上面的正则表达式中获得以下组:
答案 0 :(得分:3)
你可以使用
^(?<id>\w+)(?:\|(?:type=(?<type>\w+)|order=(?<order>\w+)))*$
参见regex demo。
详情:
^
- 字符串开始(?<id>\w+)
- 组“id”:一个或多个单词字符(?:\|(?:type=(?<type>\w+)|order=(?<order>\w+)))*
- 零次或多次重复
\|
- |
字符(?:type=(?<type>\w+)|order=(?<order>\w+))
- 任一
type=(?<type>\w+)|
- type=
文本,然后分组“类型”捕获一个或多个单词字符,然后是 OR 运算符order=
- 文本 order=
然后(?<order>\w+)
- 分组“order”:一个或多个单词字符$
- 字符串结尾。(?:...)*
重复组中的捕获组在每次捕获字符串时将不断重写组值,因此将保留最后一次出现的值。
您可以通过在第二个非捕获组中添加更多组来增强此正则表达式。例如,添加 num
和 status
就像
^(?<id>\w+)(?:\|(?:type=(?<type>\w+)|order=(?<order>\w+)|num=(?<num>\d+)|status=(?<status>\w+)))*$