正则表达式:忽略捕获组的顺序并只捕获最后一次出现

时间:2021-06-07 13:20:50

标签: regex

假设我们有以下字符串:

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

理想情况下,我们应该从上面的正则表达式中获得以下组:

  • id:1
  • type:2(因为它应该捕获最后一次出现)
  • order:asc

1 个答案:

答案 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”:一个或多个单词字符
  • $ - 字符串结尾。

(?:...)* 重复组中的捕获组在每次捕获字符串时将不断重写组值,因此将保留最后一次出现的值。

您可以通过在第二个非捕获组中添加更多组来增强此正则表达式。例如,添加 numstatus 就像

^(?<id>\w+)(?:\|(?:type=(?<type>\w+)|order=(?<order>\w+)|num=(?<num>\d+)|status=(?<status>\w+)))*$

this regex demo

相关问题