Notepad正则搜索替换:合并匹配分支后为不同结果加指定后缀
问题核心原因
之前合并正则失效的两个关键问题:
- 你写的合并正则
(m\s.*\n.*\n.*|n\s.*\n.*\n.*)把两个匹配分支嵌套在同一个捕获组内,不管匹配到m类还是n类内容,所有匹配结果都会被存到$1,根本没有独立的第二捕获组 - 替换规则硬编码拼接两个后缀,不管匹配结果属于哪类,固定写在模板里的后缀都会被输出,自然会出现两个后缀同时追加的问题
可直接落地的单条合并方案
搜索正则
将两类匹配拆分为独立的顶层捕获组,避免之前的嵌套问题:
(m\s.*\n.*\n.*)|(n\s.*\n.*\n.*)
拆分逻辑:
- 第一捕获组(
$1):完整匹配m开头的连续三行内容,匹配到n类内容时该组为空 - 第二捕获组(
$2):完整匹配n开头的连续三行内容,匹配到m类内容时该组为空
对应替换规则
适配主流PCRE正则引擎(Notepad++、Python、新版VS Code、Sublime Text等工具均支持):
(?{1}$1 -22:$2 -11)
规则逻辑:
- 如果第一捕获组匹配到内容(即m类三行块),直接输出完整的匹配内容,在第三行末尾追加
-22 - 如果第二捕获组匹配到内容(即n类三行块),直接输出完整的匹配内容,在第三行末尾追加
-11
全程不需要分两次执行替换,也不会出现多余的后缀拼接问题。
注意:执行替换前需打开编辑器的正则匹配开关,确保换行符
\n可以正常跨三行匹配,避免匹配失效。
实际匹配效果
- 匹配到m类块时,输出结果:
nn"h11p3ppppvxq3b288N1 m 227"] {vanxtageendganmesbhorgtgt(1702)} d3zd6xf8dz8xd6dz8f6zd8 -22 - 匹配到n类块时,输出结果:
[nn"5rvh11p3ppppvxq3b288N1 n 227"] {vanxtageendganmesbhorgtgt(1802)} d3zd6xf8dz8xd6dz8f6zd8 -11
内容的提问来源于stack exchange,提问作者Haji Rahmatullah
相关产品推荐
相关产品推荐

