正则表达式匹配问题:捕获含SOA的Sender/From文本块
解决方案
你的需求是捕获以Sender:或From:开头、且包含关键词SOA的文本块,原正则的匹配逻辑有问题,没法精准划分块的边界,也没强制保证SOA在块内。
试试这个正则(要开启多行模式m,让^匹配每行开头):
^(From:|Sender:)(?:\s|\S)*?SOA(?:\s|\S)*?(?=\n^(?:From:|Sender:)|\Z)
正则拆解:
^(From:|Sender:):匹配行首的From:或Sender:,作为每个目标块的起始标记(?:\s|\S)*?SOA:非贪婪匹配任意字符,直到碰到SOA(确保块内一定包含目标关键词)(?:\s|\S)*?:继续非贪婪匹配剩余内容,直到触发边界(?=\n^(?:From:|Sender:)|\Z):正向预查,匹配到下一个From:/Sender:的行首,或者文本结尾,以此确定块的结束位置
匹配结果:
用这个正则处理你的原始文本,会准确得到两个目标块:
Group-1
From:Jane Smith body: This email is unrelated to SOA.
Group-2
Sender:Jenny Let's learn SOA!
原正则问题分析:
原正则里(([\s\S]*)SOA)*?的嵌套结构会导致匹配范围混乱,负前瞻(?!(From:|Sender:))的位置不对,没法正确识别块的结束边界,而且没有强制要求SOA必须出现在匹配块中。
内容的提问来源于stack exchange,提问作者Hsu Samuel
相关产品推荐
相关产品推荐

