如何用正则表达式捕获带换行间隔的重复MY_PROJ模式?
解决正则匹配项目块的问题
我懂你现在的困扰——本来想把每个以MY_PROJ开头的区块分别捕获,结果用了多行模式的^(MY_PROJ.+)([\s\S]+)之后,第一个项目直接把后面所有内容都吞进去了,完全达不到预期的分组效果。
其实问题出在贪婪匹配上,[\s\S]+会尽可能多地匹配字符,直到字符串结束。要实现每个项目块单独捕获,我们需要让正则在遇到下一个MY_PROJ开头的行时停止匹配,这里可以用非贪婪匹配+正向预查来解决:
可行的正则表达式
^(MY_PROJ\d+)\n([\s\S]+?)(?=\nMY_PROJ|$)
正则各部分解释
^:在多行模式下,匹配每行的开头(MY_PROJ\d+):捕获项目名称(比如MY_PROJ10、MY_PROJ11),\d+确保匹配后面的数字后缀\n:匹配项目名后的换行符,分隔项目名和内容行([\s\S]+?):非贪婪匹配所有字符(包括换行),+?表示尽可能少地匹配,直到触发后面的断言(?=\nMY_PROJ|$):正向预查,告诉正则“匹配到下一个MY_PROJ开头的行,或者字符串结束时就停止”
匹配效果演示
用这个正则匹配你的输入内容,会得到两个精准的匹配结果:
- result [0]
- Group 0:
MY_PROJ10 - Group 1:
1st line 2nd line
- Group 0:
- result [1]
- Group 0:
MY_PROJ11 - Group 1:
3rd line 4th line
- Group 0:
记得要开启多行模式(比如正则工具里的m标志,或者代码里对应的多行参数),这样^才能正确匹配每行的开头。
内容的提问来源于stack exchange,提问作者hungry4code
相关产品推荐
相关产品推荐

