正则匹配XML路径值时如何将正向预查内容排除出捕获组
问题根因
你当前使用的正向肯定预查(?=<path>|<paths>)属于零宽度断言,仅会校验当前游标位置后是否存在匹配的标签内容,不会消耗任何字符、也不会移动游标位置。因此预查通过后,游标仍停留在<path>/<paths>的起始<字符前,后续的.*自然会将整行标签内容全部捕获。
解决方案
方案1:通用兼容写法(所有正则引擎支持)
直接匹配标签结构,用非捕获组过滤标签,仅捕获标签内的路径内容:
^\s*<(?:path|paths)>(.*?)</\1>$
- 逻辑说明:
^\s*匹配行首的空白字符<(?:path|paths)>匹配<path>或<paths>开头标签,?:标记为非捕获组不占用捕获名额(.*?)非贪婪匹配标签内的路径内容,对应你要的捕获结果</\1>匹配和开头对应的闭合标签(\1自动引用前面非捕获组匹配的标签名,自动适配path/paths两种情况)
测试后捕获组1的输出就是你需要的/my/data、/global/data。
方案2:支持\K语法的引擎简化写法
如果你的运行环境支持PCRE、Python3.10+、JS ES2018+等现代正则引擎,可以用\K语法直接丢弃前面匹配的标签内容,无需额外捕获组:
^\s*<(?:path|paths)>\K.*(?=</\1>$)
直接返回的匹配结果就是目标路径内容。
内容的提问来源于stack exchange,提问作者Dean
相关产品推荐
相关产品推荐

