如何编写正则表达式匹配重复的<tag>key</tag> value并提取键值对?
解决正则匹配键值对的问题
你遇到的问题很典型——默认的贪婪匹配会把后续所有内容都吞进去,导致只能拿到第一个键对应的“超大值”。要精准捕获每个键对应的、下一个<tag>出现前的内容,我们可以用正向预查来限制值的匹配边界,这是最简洁可靠的方案。
直接上可用的正则表达式:
/<tag>(.*?)<\/tag>(.*?)(?=<tag>|$)/g
拆解一下这个正则的逻辑:
<tag>(.*?)<\/tag>:和你之前的写法一样,非贪婪匹配标签内的键内容,作为第一个捕获组。(.*?):非贪婪匹配值内容,作为第二个捕获组——这里的关键是后面的预查限制了它的匹配范围。(?=<tag>|$):正向预查断言,确保匹配到下一个<tag>的开头或者字符串末尾就停止,完美避免了把后续的键值对包含进来。
测试示例
比如你的测试字符串:
<tag>key:</tag> value; <tag>key</tag> value
用这个正则全局匹配后,会得到两组结果:
- 第一组捕获:
key:,第二组捕获:value; - 第一组捕获:
key,第二组捕获:value
如果你的值内容里可能包含<但不是<tag>的情况(比如<other>),这个正则也能正常工作,因为预查是精确匹配<tag>开头的位置,不会误判。
另外,如果你的正则引擎不支持正向预查(这种情况很少见),也可以用排除型匹配的写法,但相对繁琐一些:
/<tag>(.*?)<\/tag>([^<]+|<(?!tag>))*/g
不过还是优先推荐第一种正向预查的方案,可读性和维护性都更好。
内容的提问来源于stack exchange,提问作者KrimblKrum
相关产品推荐
相关产品推荐

