如何使用正则表达式(Regex)修改一个字符串后面的所有匹配项(记事本++宏)? [英] 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])
和替换字符串$1L$2
。
在记事本++中,我在"查找和替换"对话框中启用了regex,还启用了Match case
和. matches newline
选项。
Replace
操作可按预期工作。然后,我可以反复点击Notepad++中的Replace
按钮,直到到达EOF
才能完成工作。
现在可以工作了,我想创建一个可重复使用的记事本++宏来结束单调乏味的工作,并对整个文件执行操作。
我的第一个想法是简单地使用Replace All
,但这是行不通的,因为使用Replace All
时,在每次替换操作之后不会重置regex插入符号。
如何改进我的正则表达式以将所有[bar]
节字符串替换为小写的值,并使其在记事本++宏内工作?
如果无法改进我的正则表达式,我愿意使用另一种记事本++宏技术来执行此任务。
以下内容用作上下文,不是必读内容。一旦我了解了如何做到以上几点,我就可以将我所学的内容应用到下面这个更复杂的案例中。但是如果你更喜欢关注这个更复杂的案例,那也很好。
我大大简化了上面示例的内容。在我的实际输入文件中,[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]
节标题之后的所有字和每个字后面的=
字
查找内容:(?:G(?!^)|^[bar])(?:s*Rw+=|[^w
]+)Kw+
替换为:L$0
查看regex demo&;设置屏幕快照:
正则表达式详细信息
(?:G(?!^)|^[bar])
-两者之一:上一个匹配的结束(G(?!^)
)或(|
)[bar]
单词([bar]
))(^
)(?:s*Rw+=|[^w ]+)
-零个或多个空格、换行符序列、一个或多个单词字符、=
(s*Rw+=
)或(|
)除单词字符、CR和LF([^w ]+
)以外的任何一个或多个字符K
-一个匹配重置操作符,它将到目前为止匹配的所有文本丢弃到整个匹配内存缓冲区w+
-一个或多个单词字符($0
指向此值)。
这篇关于如何使用正则表达式(Regex)修改一个字符串后面的所有匹配项(记事本++宏)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!