如何使用高效PCRE表达式匹配多行中多相似惰性量词间的上下文?
高效PCRE正则方案(处理嵌套标签的多行内容提取)
针对你需要提取外层<div>与</div>之间所有内容(含嵌套<div>)的需求,推荐使用递归匹配的PCRE正则,它能精准处理嵌套结构,避免惰性匹配提前终止的问题,且在多行场景下效率更高。
最终正则表达式
/(?s)<div>\s*((?:(?!<div>|<\/div>).|<div>(?1)<\/div>)*)\s*<\/div>/
规则解释
(?s):开启DOTALL模式,让.可以匹配换行符,适配多行场景<div>\s*:匹配外层起始标签及后续空白(含换行)- 核心捕获组
((?:(?!<div>|<\/div>).|<div>(?1)<\/div>)*):(?!<div>|<\/div>).:匹配任意非<div>/</div>开头的字符,处理普通文本内容<div>(?1)<\/div>:递归调用捕获组1的规则,匹配嵌套的<div>结构,支持任意深度的嵌套*:重复匹配上述两种情况,覆盖外层标签内的所有内容
\s*<\/div>:匹配外层结束标签及前面的空白(含换行)
为什么你的尝试不生效
- 基础表达式
/(<div>)(.*?)(</div>)/:惰性匹配.*?会在遇到第一个</div>时立即终止,只能提取到第一个嵌套<div>之前的内容,无法覆盖后续内容 - 非捕获组表达式
/(<div>)((?:<div>.*?</div>).*?)(</div>)/:仅能匹配单个嵌套<div>的场景,无法处理多个嵌套或更深层级的结构
使用说明
在PCRE兼容的工具/代码中,该正则的捕获组1即为你需要的期望结果,直接提取即可。
内容的提问来源于stack exchange,提问作者Michael Mikhjian
相关产品推荐
相关产品推荐

