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

Regex 正则表达式:忽略捕获组的顺序,只捕获最后一次出现的内容,regex,Regex,假设我们有以下字符串: 1|order=asc|type=1 我们需要创建正则表达式,将其解析为参数,假设字符串总是以数字开头,并且(可选)具有任意顺序的参数(order,asc)。此外,它可能有3个或更多参数,但为了简单起见,我们在这里保留2个参数。 例如,正则表达式将理解以下字符串: 1 1|order=asc|type=1 1|type=1|order=asc 我使用以下表达式来完成此工作: (?<id>^\w+)((?:\|type=(?<type>\w+))

假设我们有以下字符串:

1|order=asc|type=1
我们需要创建正则表达式,将其解析为参数,假设字符串总是以数字开头,并且(可选)具有任意顺序的参数(order,asc)。此外,它可能有3个或更多参数,但为了简单起见,我们在这里保留2个参数。 例如,正则表达式将理解以下字符串:

1
1|order=asc|type=1
1|type=1|order=asc
我使用以下表达式来完成此工作:

(?<id>^\w+)((?:\|type=(?<type>\w+))|(?:\|order=(?<order>\w+))){0,2}
理想情况下,我们应该从上面的正则表达式中选择以下组:

  • 身份证号码:1
  • 类型:2(因为它应该捕获最后一次出现)
  • 订单:asc
您可以使用

^(?\w+(?:类型=(?\w+)|顺序=(?\w+)*$

详情:

  • ^
    -字符串开始
  • (?\w+)
    -组“id”:一个或多个单词字符
  • (?:类型=(?\w+)(顺序=(?\w+))*
    -零次或多次重复
    • \\\\\\
      -a
      \
      字符
    • (?:type=(?\w+)| order=(?\w+)
      -以下任一项
      • type=(?\w+)|
        -
        type=
        文本,然后将捕获一个或多个单词字符的“type”分组,然后是or运算符
      • order=
        -文本
        order=
        ,然后
      • (?\w+)
        -分组“顺序”:一个或多个单词字符
  • $
    -字符串结束
(?:…)*
重复组中的捕获组将在每次捕获字符串时继续重新写入组值,因此将保留最后出现的值

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

^(?<id>\w+)(?:\|(?:type=(?<type>\w+)|order=(?<order>\w+)|num=(?<num>\d+)|status=(?<status>\w+)))*$
(?\w+)(?:类型=(?\w+)(顺序=(?\w+)(数量=(?\d+)(状态=(?\w+))*$

请参阅。

可能类似于
^(?\w+)(?:type=(?\w+)| order=(?\w+))++$
的东西可以吗?请参阅从第一个输入捕获
,您需要
*
而不是
+
@WiktorStribiżew。不过这是个不错的解决方案。发布?是的,我应该在最后一组中使用
*
。如果您需要支持未知参数,您可以添加
\w+=\w*
模式作为替代,
*
匹配太多。请参见
^(?\w+)(?:type=(?\w+))(?\w+)(order=(?\w+)(num=(?\d+)(status=(?\w+))(?\w+)(:\ \ \ \w*)
()。@第四只鸟我们只需要记住,JavaScript和ECMAScript中的这个技巧通常是在每次捕获时用空字符串重新初始化非参与组(只有最后捕获的组实际上填充了一个值,其余的将为空)。很高兴知道,我没有意识到这一点。这仍然是一个很好的答案。
^(?<id>\w+)(?:\|(?:type=(?<type>\w+)|order=(?<order>\w+)|num=(?<num>\d+)|status=(?<status>\w+)))*$