正则表达式如何匹配指定序号后含换行符的完整文本
正则匹配多行序号后内容解决方案
你之前写的(?<=\d°\)).*匹配不全的根本原因是:默认正则规则下,.通配符不匹配换行符,遇到文本里的换行就会终止匹配。
下面是两种可直接使用的写法:
方案1:开启dotall(单行)模式(推荐)
- 正则表达式:
(?s)(?<=\d°\)).*?(?=\s*(?:<p>)?\d°\)|</p>|$)
- 规则说明:
(?s)是单行模式修饰符,开启后.可以匹配包括换行符在内的所有字符.*?用非贪婪模式匹配内容,避免跨序号过度匹配- 正向预查部分用来划定匹配终止边界:碰到下一个序号开头、当前p标签闭合、或者整个字符串结尾就停止匹配,不会把不属于当前序号的无关内容纳入匹配结果
方案2:无模式修饰符兼容写法
如果你的使用场景不支持添加模式修饰符,直接用[\s\S]替代.即可——这个字符组天然覆盖所有字符(空白、换行、普通文本都能匹配),不需要修改匹配模式:
(?<=\d°\))[\s\S]*?(?=\s*(?:<p>)?\d°\)|</p>|$)
匹配效果说明
使用上述正则可以准确拿到2个目标匹配结果:
- 第一个结果对应
1°)后到第一个段落结束的全部内容,包含所有换行的文本 - 第二个结果对应
2°)后到对应段落结束的全部内容,不会遗漏换行后的片段
内容的提问来源于stack exchange,提问作者Antonin Bougeard
相关产品推荐
相关产品推荐

