如何用正则表达式匹配两个指定模式之间的所有多行内容
多行模式下两个标记间内容的正则提取方案
核心问题原因
默认正则规则中,.元字符仅匹配换行符以外的字符,因此你之前的单行匹配写法无法适配跨多行的场景。
可用解决方案
方案1:开启DotAll(单行)模式(兼容性较好,支持绝大多数主流正则引擎)
直接在正则开头加(?s)内联标识开启DotAll模式,让.可以匹配换行符,配合非贪婪匹配即可精准提取内容:
(?s)(?<=pattern1\n).*?(?=\npattern2)
如果要兼容pattern1/pattern2前后存在空行的场景,可调整为:
(?s)(?<=pattern1\s*).*?(?=\s*pattern2)
使用示例(Python):
import re test_content = """pattern1 line1 line2 line3 line4 line5 pattern2""" match_res = re.search(r'(?s)(?<=pattern1\n).*?(?=\npattern2)', test_content) if match_res: print(match_res.group())
运行后直接输出pattern1和pattern2之间的所有行内容。
方案2:兼容无DotAll模式的引擎
如果你的运行环境不支持DotAll模式(比如旧版JavaScript),可以用[\s\S]字符集代替.,该字符集匹配所有空白、非空白字符,天然包含换行符,无需额外开启模式:
(?<=pattern1\n)[\s\S]*?(?=\npattern2)
内容的提问来源于stack exchange,提问作者amir RADian
相关产品推荐
相关产品推荐

