正则表达式查找替换完整匹配(连续重复保留分隔符)技术求助
需求说明
查找时需匹配完整单词/短语并进行替换:
- 若替换值为空,则删除匹配项;
- 若替换值非空,则替换为指定单词/短语并保留分隔符。
原始文本
1: Coconut 2: ACoconut 3: Coconut! 4: !CoconutA 5: Coconut,Orange,Coconut,Pear,Coconut 6: ACoconut,Orange,Coconut!,Pear,!CoconutA 7: Coconut,Coconut 8: ACoconut,Coconut! 9: Coconut,Coconut,Coconut 10: ACoconut,Coconut!,!CoconutA 11: Coconut,Coconut,Orange 12: ACoconut,!Coconut,Orange 13: Coconut,Coconut,Coconut,Orange 14: Coconut,ACoconut,!Coconut,Orange 15: Orange,Coconut,Coconut,Pear 16: Orange,Coconut,CoconutA,Pear 17: Orange,Coconut,Coconut,Coconut,Pear 18: Orange,ACoconut,Coconut,!Coconut,Pear 19: Pear,Coconut,Coconut 20: Pear,Coconut!,Coconut 21: Pear,!Coconut,Coconut,ACoconut 22: Pear,CoconutA,!Coconut,Coconut
预期结果
注意事项
- 使用Notepad++进行查找替换;
- 单词/短语前后存在额外字符时不算完整匹配(仅忽略逗号);
- 单词/短语通过分隔符(此处为逗号)连续重复时,该序列需替换为单个单词/短语,无论序列在文本开头、中间或结尾;
- 必须匹配完整单词/短语(需使用
^、逗号分隔符和$),替换时无需手动指定分隔符,需通过捕获组实现。
替换值:空值(非空格)
1: 2: ACoconut 3: Coconut! 4: !CoconutA 5: Orange,Pear 6: ACoconut,Orange,Coconut!,Pear,!CoconutA 7: 8: ACoconut,Coconut! 9: 10: ACoconut,Coconut!,!CoconutA 11: Orange 12: ACoconut,!Coconut,Orange 13: Orange 14: ACoconut,!Coconut,Orange 15: Orange,Pear 16: Orange,CoconutA,Pear 17: Orange,Pear 18: Orange,ACoconut,!Coconut,Pear 19: Pear 20: Pear,Coconut! 21: Pear,!Coconut,ACoconut 22: Pear,CoconutA,!Coconut
替换值:Tomato
1: Tomato 2: ACoconut 3: Coconut! 4: !CoconutA 5: Tomato,Orange,Tomato,Pear,Tomato 6: ACoconut,Orange,Coconut!,Pear,!CoconutA 7: Tomato 8: ACoconut,Coconut! 9: Tomato 10: ACoconut,Coconut!,!CoconutA 11: Tomato,Orange 12: ACoconut,!Coconut,Orange 13: Tomato,Orange 14: Tomato,ACoconut,!Coconut,Orange 15: Orange,Tomato,Pear 16: Orange,Tomato,CoconutA,Pear 17: Orange,Tomato,Pear 18: Orange,ACoconut,Tomato,!Coconut,Pear 19: Pear,Tomato 20: Pear,Coconut!,Tomato 21: Pear,!Coconut,Tomato,ACoconut 22: Pear,CoconutA,!Coconut,Tomato
我的尝试及结果
- 查找内容:
^(Coconut)$|^(Coconut)(,)|(,)(Coconut)(,)|(,)(Coconut)$- 替换为:
$4$7$3$6
1: - 替换为:
2:
ACoconut
3:
Coconut!
4:
!CoconutA
5:
,Orange,,Pear,
6:
ACoconut,Orange,Coconut!,Pear,!CoconutA
7:
,Coconut
8:
ACoconut,Coconut!
9:
,Coconut,
10:
ACoconut,Coconut!,!CoconutA
11:
,Coconut,Orange
12:
ACoconut,!Coconut,Orange
13:
,Coconut,,Orange
14:
,ACoconut,!Coconut,Orange
15:
Orange,,Coconut,Pear
16:
Orange,,CoconutA,Pear
17:
Orange,,Coconut,,Pear
18:
Orange,ACoconut,,!Coconut,Pear
19:
Pear,,Coconut
20:
Pear,Coconut!,
21:
Pear,!Coconut,,ACoconut
22:
Pear,CoconutA,!Coconut,
2. 替换为: $4$7Tomato$3$6
1: Tomato 2: ACoconut 3: Coconut! 4: !CoconutA 5: Tomato,Orange,Tomato,Pear,Tomato 6: ACoconut,Orange,Coconut!,Pear,!CoconutA 7: Tomato,Coconut 8: ACoconut,Coconut! 9: Tomato,Coconut,Tomato 10: ACoconut,Coconut!,!CoconutA 11: Tomato,Coconut,Orange 12: ACoconut,!Coconut,Orange 13: Tomato,Coconut,Tomato,Orange 14: Tomato,ACoconut,!Coconut,Orange 15: Orange,Tomato,Coconut,Pear 16: Orange,Tomato,CoconutA,Pear 17: Orange,Tomato,Coconut,Tomato,Pear 18: Orange,ACoconut,Tomato,!Coconut,Pear 19: Pear,Tomato,Coconut 20: Pear,Coconut!,Tomato 21: Pear,!Coconut,Tomato,ACoconut 22: Pear,CoconutA,!Coconut,Tomato
解决方案
核心思路
先把连续重复的Coconut序列合并为单个,再处理单个完整匹配的Coconut,确保符合需求中的连续序列替换规则。操作时需在Notepad++中开启正则表达式模式(搜索模式选择「正则表达式」,无需勾选「.匹配换行符」)。
场景1:替换值为空
分两步执行替换:
合并连续的
Coconut序列- 查找内容:
(Coconut)(?:,(Coconut))+ - 替换为:
$1
作用:把所有连续的Coconut,Coconut或Coconut,Coconut,Coconut这类序列替换成单个Coconut。
- 查找内容:
删除所有完整匹配的单个
Coconut- 查找内容:
^Coconut,|,Coconut,|,Coconut$|^Coconut$ - 替换为:(留空,不输入任何内容)
作用:^Coconut,:删除行首的Coconut及后续逗号,Coconut,:删除中间的Coconut,保留单个逗号,Coconut$:删除行尾的逗号及Coconut^Coconut$:删除整行仅有的Coconut
- 查找内容:
场景2:替换值为Tomato
同样分两步执行替换:
合并连续的
Coconut序列- 查找内容:
(Coconut)(?:,(Coconut))+ - 替换为:
$1
作用和场景1一致,先合并连续序列。
- 查找内容:
替换所有完整匹配的单个
Coconut为Tomato- 查找内容:
(^|,)Coconut($|,) - 替换为:
$1Tomato$2
作用:保留Coconut前后的行首/逗号分隔符,仅将Coconut替换为Tomato,同时处理行首、行尾、中间的所有完整匹配情况。
- 查找内容:
内容的提问来源于stack exchange,提问作者Stes Mus

