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

How to using regular expressions (regex) to modify all occurrences of a string that follow another string (Notepad++ macro)?

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

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

期望的输出是:

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

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

在 Notepad++ 中,我在“查找和替换”对话框中启用了正则表达式,还启用了 Match case. matches newline 选项。

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

既然这可行,我想创建一个可重复使用的 Notepad++ 宏来结束乏味的工作并对整个文件执行操作。

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

时,每次替换操作后正则表达式插入符号都不会重置

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

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


以下内容仅供参考,不需要阅读。一旦我理解了如何执行上述操作,我就可以将我学到的知识应用到以下更复杂的案例中。但是,如果您更愿意专注于这个更复杂的案例,那也很好。

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

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

[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

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

您可以匹配 [bar] 部分 header 之后的所有 单词 以及每个单词后跟 = 使用

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

查看 regex demo 和设置屏幕截图:

正则表达式详细信息

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