【问题标题】:RegEx to Find & Replace X text in between Y text and Z text正则表达式在 Y 文本和 Z 文本之间查找和替换 X 文本
【发布时间】:2013-12-05 05:01:10
【问题描述】:
论坛成员,
我正在使用 NotePad++ 6.1.2 版,我需要知道是否可以让通用表达式执行完成以下操作的查找和替换操作:
它找到位于“Y”和“Z”文本之间的“X”文本并将其替换为空,以有效地删除“X”文本以及“Y”和“Z”文本。因此,对于下面显示的句子,一般表达式需要删除单词“Begin”和“End”之间的所有文本以及“Begin”和“End”之间的所有文本以删除所有内容。
开始“X”个文本量结束
我应该指出,“开始”和“结束”在整个文本文件中是一致的。因此,我需要通用表达式来查找“开始”和“结束”的每个实例,然后删除它们以及介于两者之间的任何文本。任何帮助将不胜感激。谢谢。
【问题讨论】:
标签:
regex
replace
notepad++
【解决方案1】:
按 Ctrl+H 打开查找和替换对话框。在底部的“搜索模式”中选择“正则表达式”。选中“。匹配换行符”复选框。
在“查找内容”中粘贴以下内容:
Begin.*?End
在“替换为”中留空。
按“全部替换”。
【解决方案2】:
因此,当且仅当 X 在 Y 和 Z 之间时,您才想删除 Y、X、Z:
一个例子:
Y = "BEGIN"
Z = "END"
X = "CHOUCROUTE"
图案:
search : BEGIN(?>[^CE]+|C(?!HOUCROUTE)|E(?!ND))*CHOUCROUTE[\s\S]*?END
replace: nothing
(?>[^CE]+|C(?!HOUCROUTE)|E(?!ND))*这部分需要匹配除关键字或结束词之外的所有内容,让我们详细看一下:
(?> # open an atomic group
[^CE]+ # all except the letters C and E
| # OR
C(?!HOUCROUTE) # C not followed by the end of the keyword
| # OR
E(?!ND) # E not followed by the end of the closing word
)* # repeat the group zero or more times
原子组的目标是避免灾难性的回溯。原子组禁止正则表达式引擎回溯。如果我使用了非捕获组,并且正则表达式引擎没有找到关键字,它会尝试所有可能的划分。
如果您使用不具备原子组功能的旧版 notepad++,您可以升级您的版本或使用此技巧模拟它(默认情况下,前瞻的内容是原子的):
((?=([^CE]+|C(?!HOUCROUTE)|E(?!ND)))\1)*