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+)*$
看
详情:
-字符串开始^
-组“id”:一个或多个单词字符(?\w+)
-零次或多次重复(?:类型=(?\w+)(顺序=(?\w+))*
-a\\\\\\
字符\
-以下任一项(?:type=(?\w+)| order=(?\w+)
-type=(?\w+)|
文本,然后将捕获一个或多个单词字符的“type”分组,然后是or运算符type=
-文本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+)))*$