如何使用正则表达式仅匹配两个指定字符串之间的符合规则的内容
正则匹配指定区间内的所有符合规则的内容
方案1:两步法(更推荐,可读性高、兼容性好)
你已经可以成功提取abcd和xyz之间的文本,只需要再加一步全局匹配即可:
- 第一步提取区间内容,正则补充单行模式标记,确保跨行匹配生效:
(?s)(?<=abcd\n).*?(?=\nxyz)
注:部分编程语言不需要加(?s),可单独设置单行匹配模式 - 第二步在提取到的区间文本中,全局匹配目标规则:
a=[^;]*;
用[^;]*替代.*可以避免意外跨分号匹配,结果更准确。
方案2:单条正则一步匹配(适合仅允许输入一条正则的场景)
直接使用如下正则即可一次性拿到所有符合要求的结果:(?s)(?:abcd\n|\G(?!^))(?:(?!a=|xyz).)*\K(a=[^;]*;)
各部分逻辑说明:
(?s):开启单行模式,让.可以匹配换行符(?:abcd\n|\G(?!^)):锚定匹配起点,要么从abcd的下一行开始,要么从上一次匹配结束的位置继续,确保所有匹配都落在abcd之后(?:(?!a=|xyz).)*:跳过所有既不是a=开头、也不是xyz开头的内容,遇到xyz就自动终止匹配\K:丢弃前面已经匹配的前缀内容,仅保留后面的目标匹配项(a=[^;]*;):匹配你需要的a=.*;格式内容
两种方案最终输出结果都为:
a=1; a=2; a=4;
不会匹配到xyz之后的a=5;、a=6;。
内容的提问来源于stack exchange,提问作者Nir
相关产品推荐
相关产品推荐

