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

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

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

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

以下是我所拥有的:

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

以下是我想要的:

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

答案1

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

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

xkcd - Perl 问题


下面是部分可用的旧正则表达式解决方案。我沉重建议您不要使用它。

快速回答:不要使用 Notepad++,使用JS 代码片段(在右下角输入您的文本,然后单击提交)。根据需要替换左下角脚本中的START和。END

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

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

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

此特定解决方案仅在以下情况下才有效且不会出现错误:START每行出现次数 END每行出现次数它们不跨越行 - 所以我们可以独立处理每一行。


假设每行只需要一个匹配,并且每个匹配都包含在一行中,则匹配(?<=START.*?)-(?=.*?END)并替换为单个空格是可行的 -除了Notepad++ 似乎不喜欢这种特定模式。它支持后向查询和前向查询(显然是完整的 PCRE),但其中有些东西让它出错了。

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

在这里,我们尝试使用更完整的脚本语言。JavaScript 是一个不错的选择。然而,它没有支持后视。好的一面是,我们可以循环运行,因此之前繁琐的解决方案实际上是可行的。我创建了一个例子这里

答案2

一个合适的正则表达式是(START[^\-]*)-(.*END),将其替换为\1 \2并多次使用“全部替换”(每次点击每行只替换一个)。

相关内容