regex - 如何使用正则表达式(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 case
and. matches newline
选项。
这样做,执行Replace
操作按预期工作。然后我可以反复点击Replace
Notepad++ 中的按钮,直到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
解决方案
在 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
指向该值)。
推荐阅读
- python - 变形金刚:获取 KeyError:model.fit 上的“sentence_embedding”
- php - WooCommerce 自定义产品类型选项不隐藏自定义产品选项卡
- android - 如何创建一个可以从 ViewModel 和 Activity 访问的函数?
- c# - 试图在用户输入他们的年龄并告诉他们他们出生的年份的c#中制作它
- go - Go:如果初始化可能出错或恐慌,我应该在哪里初始化包级变量?
- reactjs - Syncfusion反应网格服务器端分页错误
- rust - 哈希映射
.entry() 错误与`未声明的类型'Entry'` - python - 如何使用原始 sql 处理一页上的多个搜索字段?
- android - Android根据特定按钮发送意图(带数据)
- javascript - 在嵌套对象键上使用 forEach 反应 javascript