如何用正则匹配含#Test的行及后续符合规则的行直至空行?
正则匹配需求:包含
#Test的行及后续符合规则的行,遇空行停止 需求说明
匹配任意包含#Test的行,以及该行之后所有以「任意数量空格后跟;」开头的行,遇到空行(或全空格行)时立即停止匹配。
示例1
1. ; #Test 2. ; bbbb 3. 4. ; #Test 5. 6. ; aaa
匹配结果:第1、2行是一个匹配项,第4行是另一个匹配项。
当前实现与问题
已实现正则:\s*(#Test).*(\s*;.*)*
当前问题:无法在遇到空行时停止匹配,会错误跨过空行继续匹配后续符合规则的行。
示例2
1. ; #Test 2. ; bbbb 3. 4. xxxx 5. ; #Test 6. yyyy 7. 8. ; #Test 9. 10. ; bbb
匹配结果:第1、2行是一个匹配项,第5行是另一个匹配项,第8行是另一个匹配项。
解决方案
使用带**多行模式(m修饰符)**的正则表达式,通过先行断言排除空行,实现遇空行停止:
^.*#Test.*$(?:\n(?!^\s*$)\s*;.*$)*
正则解释
^.*#Test.*$:匹配包含#Test的整行(多行模式下^匹配行首,$匹配行尾)(?:...):非捕获组,用于重复匹配后续符合规则的行\n(?!^\s*$):换行后,通过先行断言确保当前行不是空行/全空格行\s*;.*$:匹配以任意数量空格+;开头的行
注意事项
必须开启多行模式(m修饰符),否则^和$会匹配整个文本的开头和结尾,无法按行匹配。
内容的提问来源于stack exchange,提问作者Cesar
相关产品推荐
相关产品推荐

