如何替换特定单词之间的特定字符?

Pio*_*cki 2 notepad++ regex find-and-replace

您能否帮助我找出如何使用 Notepad++ 查找/替换功能来替换特定单词之间的特定字符。请参见下面的示例,我想找到单词 'START' 和 'END' 之间的所有连字符并将它们替换为空格。文档中的所有其他连字符都不会被替换。

我一直在尝试使用我在 google 上搜索的正则表达式示例来解决这个问题,但不幸的是,到目前为止我还没有成功。

这是我所拥有的:

START-Hyphens-should-be-replaced-here-01-END
OTHER-no-changes-here-02-WORD
START-Hyphens-should-also-be-replaced-here-03-END
OTHER-no-changes-here-either-04-TEXT
Run Code Online (Sandbox Code Playgroud)

这是我想要的:

START Hyphens should be replaced here 01 END
OTHER-no-changes-here-02-WORD
START Hyphens should also be replaced here 03 END
OTHER-no-changes-here-either-04-TEXT
Run Code Online (Sandbox Code Playgroud)

Bob*_*Bob 5

我建议你完全放弃正则表达式 - 在这种情况下让它工作太麻烦了。不是所有的事情都可以用正则表达式轻松解决!在这种情况下,大多数脚本语言可以很容易地做到这一点。我在这里为您编写了一段 JavaScript - 只需输入您的分隔符和输入,然后单击提交。

至于解释:它由开始分隔符分割,然后对于每个“块”,它由结束分隔符分割。我们最终得到一个位于开始和结束之间的文本块,并对其执行替换。然后我们将拆分的块重新连接在一起。这不是最有效的方法,但比处理单个字符要容易一些。

xkcd - Perl 问题


旧的、部分有效的正则表达式解决方案如下。我强烈建议您不要使用它。

快速回答:不要使用 Notepad++,使用这个JS 代码片段(在右下角输入您的文本并点击提交)。更换STARTEND脚本到左必要底部。

或者,您可以使用 Windows (Vista+) 原生的 PowerShell:

Get-Content input.txt | %{ $_ -replace "(?<=START.*?)-(?=.*?END)", " " } | Out-File output.txt
Run Code Online (Sandbox Code Playgroud)

更换input.txtoutput.txt相应地。注意:它们必须是不同的文件。

如果你只有这个特定的解决方案仅适用没有错误一个发生START每行 一个发生END每行他们不跨线-所以我们可以处理每一行独立。


鉴于保证每行只需要一个匹配项,并且每个匹配项都包含在一行中,匹配(?<=START.*?)-(?=.*?END)和替换单个空格是可行的 -除了Notepad++ 似乎不喜欢这种特定模式。它支持lookbehinds和lookaheads(显然是完整的PCRE),但是有一些事情会绊倒它。

另一种与 Johannes 已经回答的类似的替代方法是使用一个简单的模式:(START.*?)-(.*?END)并将其替换为\1 \2. 这里的问题是这一次只会匹配每行一个连字符。这很快变得乏味。

在这里,我们尝试使用更完整的脚本语言。JavaScript 是一个不错的选择。但是,它支持后视。从好的方面来说,我们可以循环运行,所以以前乏味的解决方案实际上是可行的。我在这里创建了一个示例。