如何编写正则表达式匹配多个变量序列并保留所有剩余字符?
如何用正则表达式匹配多个变量实例并包含所有剩余字符?
目标字符串:
"things/groups/%S<match_00>/colors/%S<match_01>/details"
你之前尝试的几种模式存在的问题:
- 模式
(.*?)(%S<)(.*?)(>)(.*?):能匹配到match_00和match_01,但遗漏了末尾的/details - 模式
(.*?)(%S<)(.*?)(>)(.*):包含了整个字符串,但只能捕获第一个变量match_00 - 模式
(.*?)(%S<)(.*)(>)(.*):包含整个字符串,但把match_00到match_01之间的所有内容合并成一个分组,无法分别获取两个变量 - 模式
(.*)(%S<)(.*)(>)(.*):包含整个字符串,但只能捕获第二个变量match_01
解决方案
如果你的需求是同时保留整个字符串内容,并且提取所有%S<>包裹的变量,可以分两种场景处理:
1. 提取所有变量 + 保留原字符串
直接保留原字符串以获取完整内容,再用带全局修饰符g的正则提取所有变量:
- 提取变量的正则:
%S<(.*?)>
这个正则会匹配每一个%S<>包裹的内容,捕获组中就是你需要的match_00、match_01这类变量。
2. 单个正则捕获整个字符串和所有变量(适用于固定数量变量的场景)
如果变量数量固定(比如这里是2个),可以用以下正则一次性捕获整个字符串和每个变量:
^(.*?)(%S<(.*?)>)(.*?)(%S<(.*?)>)(.*)$
- 分组1:
things/groups/(第一个变量前的内容) - 分组3:
match_00(第一个变量) - 分组5:
match_01(第二个变量) - 分组6:
/details(最后一个变量后的内容) - 将所有分组拼接即可得到完整的原字符串。
如果变量数量不固定,建议用第一种方法:先保留原字符串,再用全局匹配提取所有变量,这种方式更灵活。
内容的提问来源于stack exchange,提问作者William Hoff
相关产品推荐
相关产品推荐

