正则<div dir=.*?>可匹配div标签,加<br />规则后为何匹配失败?
匹配失败原因
核心问题是正则默认规则下,.通配符不匹配换行符,结合非贪婪匹配的回溯逻辑就会出现这个现象:
- 正则
<div dir=.*?>不需要匹配div标签闭合后的内容,非贪婪规则会在定位到第一个>(即<div dir="auto">的闭合尖括号)时直接完成匹配,不管>后面跟的是换行还是其他内容,所以能正常生效。 - 正则
<div dir=.*?><br />要求匹配到div的闭合>后,必须紧接<br />片段。从匹配失败的表现来看,实际测试文本里<div dir="auto">和<br />之间存在换行(整理问题文本时可能无意删掉了换行格式),此时匹配流程为:- 首先匹配固定字面量
<div dir= - 非贪婪模式下
.*?从匹配0个字符开始尝试,逐字向后检索直到找到第一个>,也就是第一行末尾的div闭合尖括号 - 此时
>后的第一个字符是换行符,和正则后续要匹配的<字面量不匹配,当前位置匹配失败 - 正则引擎触发回溯,让
.*?匹配更多字符,寻找下一个后面能跟<br />的>位置,但因为.默认无法匹配换行符,.*?永远不能跨过换行到达第二行的<br />位置,最终整个正则匹配失败
- 首先匹配固定字面量
修复方案
两种常用方案可以解决这个问题:
- 开启正则的单行(Dotall)模式,让
.可以匹配包括换行符在内的所有字符,非贪婪匹配就能顺利跨过换行定位到<br />完成匹配 - 直接把正则里的
.替换为[\s\S](匹配所有空白+非空白字符,等价于任意字符,不受模式开关影响),同时可以在两个标签之间加上可选空白匹配,兼容标签间存在空格、换行、缩进的场景,修改后正则为:<div dir=[\s\S]*?>\s*<br />
内容的提问来源于stack exchange,提问作者user19120926
相关产品推荐
相关产品推荐

