首页 > 解决方案 > 如何使用正则表达式(regex)来修改所有出现在另一个字符串之后的字符串(Notepad++ 宏)?

问题描述

在下面的最小可重现示例中,我想将部分中的所有单词变为[bar]小写:

[foo]
foo1=Hello World
[bar]
bar1=Hello World
bar2=Worldly Hello

所需的输出是:

[foo]
foo1=Hello World
[bar]
bar1=hello world
bar2=worldly hello

为此,我使用(.*?\[bar\].*?)([A-Z])带有替换字符串的正则表达式 (regex) $1\L$2

在 Notepad++ 中,我在 Find & Replace 对话框中启用了正则表达式,并启用了Match caseand. matches newline选项。

这样做,执行Replace操作按预期工作。然后我可以反复点击ReplaceNotepad++ 中的按钮,直到EOF完成工作。

所以现在这个工作,我想创建一个可重用的 Notepad++ 宏来结束乏味并对整个文件执行操作。

我的第一个想法是简单地使用Replace All,但这行不通,因为使用Replace All.

如何改进我的正则表达式以[bar]用小写值替换所有部分字符串并使其在 Notepad++ 宏中工作?

如果无法改进我的正则表达式,我愿意使用另一种 Notepad++ 宏技术来执行此任务。


以下内容仅作为上下文,不是必需阅读。一旦我了解了如何执行上述操作,我就可以将我所学的内容应用于以下更复杂的情况。但是,如果您更愿意专注于这个更复杂的案例,那也很好。

对于上面的例子,我大大简化了事情。[sections]在我的实际输入文件中,节前后有多个[bar]。另外,我只想将小写应用于不是字符串中第一个单词的所有单词的第一个字母。也就是说,我有工作代码来完成这一切,所以如果我得到一个在宏中工作的大大简化的示例(上图),我应该可以毫无问题地适应更复杂的现实世界案例。

如果您对更复杂的现实世界案例感兴趣,这里是示例输入:

[foo]
foo1=Hello World
[bar]
bar1=Hello World
bar2=Worldly Hello
bar3=Worldly-Hello
bar4=worldly+Hello
[baz]
baz1=Hello World

这里是所需的输出:

[foo]
foo1=Hello World
[bar]
bar1=Hello world
bar2=Worldly hello
bar3=Worldly-hello
bar4=worldly+hello
[baz]
baz1=Hello World

标签: regexreplacemacrosnotepad++regexp-replace

解决方案


在 Notepad++ 中,有几个怪癖使得这种替换比在其他类似环境中更难。

您可以匹配节标题之后的所有单词,并且[bar]在每个单词之后使用=using

查找内容(?:\G(?!^)|^\[bar])(?:\s*\R\w+=|[^\w\r\n]+)\K\w+
替换为\L$0

请参阅正则表达式演示和设置屏幕截图:

在此处输入图像描述

正则表达式详细信息

  • (?:\G(?!^)|^\[bar])- 两者之一:上一个匹配的结尾 ( \G(?!^)) 或 ( |)[bar]单词 ( \[bar]) 在行的开头 ( ^)
  • (?:\s*\R\w+=|[^\w\r\n]+)- 零个或多个空格、一个换行序列、一个或多个单词字符、=( \s*\R\w+=) 或 ( |) 除单词字符、CR 和 LF ( [^\w\r\n]+)之外的任何一个或多个字符
  • \K- 匹配重置运算符,将迄今为止匹配的所有文本丢弃到整体匹配内存缓冲区中
  • \w+- 一个或多个单词字符($0指向该值)。

推荐阅读