如何使用正则表达式在 Notepad++ 或 IntelliJ 中将驼峰变量转换为带下划线的小写
How to convert a camelCased variable to lowercase with underscores in Notepad++ or IntelliJ using regular expressions
我必须重命名数百个文件中的 toString 输出变量,每个文件中出现很多次。以最有效的方式,我该如何解析这段文字:
.append(", myVariable=").append(myVariable)
.append(", myOtherVariable=").append(myOtherVariable)
.append(", mylowervariable=").append(myLowerVariable) // note the left is already lowercase
.append(", myVarWithURL=").append(myVarWithURL);
它变成:
.append(", my_variable=").append(myVariable)
.append(", my_other_variable=").append(myOtherVariable)
.append(", mylowervariable=").append(myLowerVariable) // note the left is already lowercase
.append(", my_var_with_url=").append(myVarWithURL);
等号右边的保持不变,等号左边的如果包含大写字符,则进行更改。
这些将是任意长度的,具有不同数量的大写字母。我在想我必须做一些前瞻性的工作,但无法让替换值正常工作。
我可以灵活地在 IntelliJ 或 Notepad++ 中执行此操作,因此我可以轻松地执行 \l \L 运算符以将替换值变为小写。
这是我的思考过程:
在:myLongCamelCasedVariable
re: ([a-z]+)([A-Z]{1})([a-z]+) // 为捕获重复分组
group 1 group 2 group 3 group 4
my + [ L + ong ] + [ C + amel ] + [ C + ased ] + [ V + ariable ]
是否可以使用正则表达式有效地捕获较大文本字符串中 'text' 的各个组,并在其上捕获 'loop' 并应用输出?
输出:$1_\l$2 ....等等
现在我卡住了
您可以使用
查找内容:(?:\G(?!\A)|",\h*)\K(\b|[a-z]+)([A-Z]+)(?=\w*=")
替换为:_\L
匹配大小写:True
详情:
(?:\G(?!\A)|",\h*)
- 从上一次成功匹配 (\G(?!\A)
) 或 (|
) 一个 ",
和零个或多个水平空格 (",\h*
)
\K
- 从匹配内存缓冲区中删除到目前为止匹配的文本
(\b|[a-z]+)
- 第 1 组:单词边界或一个或多个小写字母
([A-Z]+)
- 第 2 组:一个或多个大写字母
(?=\w*=")
- 紧靠右边,必须有零个或多个单词字符后跟 =
个字符。
替换为 _\L
:第 1 组,_
,然后是小写的第 2 组值。
查看 Notepad++ 演示屏幕:
您可以匹配大写字符、可选大写字符和可选小写字符的序列。
在替换中使用 _
后跟小写匹配 \L[=14=]
查找内容:
(?>,\h+[a-z]+|\G(?!^))\K[A-Z][A-Z]*[a-z]*
(?>
原子团
,\h+[a-z]+
匹配逗号、1 个或多个空格和 1 个或多个小写字符
|
或
\G(?!^)
断言当前位置在上一个匹配的末尾而不是在字符串的开头(因此交替的第一部分必须首先匹配)
)
关闭原子组
\K
忘记目前匹配的是什么
[A-Z][A-Z]*[a-z]*
匹配大写字符后跟可选的大小写字符
替换为:
_\L[=11=]
在不使用 \K
的情况下,您可以使用 2 个捕获组。
(?>(, [a-z]+)|\G(?!^))([A-Z][A-Z]*[a-z]*)
在替换中使用_\L
我必须重命名数百个文件中的 toString 输出变量,每个文件中出现很多次。以最有效的方式,我该如何解析这段文字:
.append(", myVariable=").append(myVariable)
.append(", myOtherVariable=").append(myOtherVariable)
.append(", mylowervariable=").append(myLowerVariable) // note the left is already lowercase
.append(", myVarWithURL=").append(myVarWithURL);
它变成:
.append(", my_variable=").append(myVariable)
.append(", my_other_variable=").append(myOtherVariable)
.append(", mylowervariable=").append(myLowerVariable) // note the left is already lowercase
.append(", my_var_with_url=").append(myVarWithURL);
等号右边的保持不变,等号左边的如果包含大写字符,则进行更改。
这些将是任意长度的,具有不同数量的大写字母。我在想我必须做一些前瞻性的工作,但无法让替换值正常工作。
我可以灵活地在 IntelliJ 或 Notepad++ 中执行此操作,因此我可以轻松地执行 \l \L 运算符以将替换值变为小写。
这是我的思考过程:
在:myLongCamelCasedVariable
re: ([a-z]+)([A-Z]{1})([a-z]+) // 为捕获重复分组
group 1 group 2 group 3 group 4
my + [ L + ong ] + [ C + amel ] + [ C + ased ] + [ V + ariable ]
是否可以使用正则表达式有效地捕获较大文本字符串中 'text' 的各个组,并在其上捕获 'loop' 并应用输出?
输出:$1_\l$2 ....等等
现在我卡住了
您可以使用
查找内容:(?:\G(?!\A)|",\h*)\K(\b|[a-z]+)([A-Z]+)(?=\w*=")
替换为:_\L
匹配大小写:True
详情:
(?:\G(?!\A)|",\h*)
- 从上一次成功匹配 (\G(?!\A)
) 或 (|
) 一个",
和零个或多个水平空格 (",\h*
)\K
- 从匹配内存缓冲区中删除到目前为止匹配的文本(\b|[a-z]+)
- 第 1 组:单词边界或一个或多个小写字母([A-Z]+)
- 第 2 组:一个或多个大写字母(?=\w*=")
- 紧靠右边,必须有零个或多个单词字符后跟=
个字符。
替换为 _\L
:第 1 组,_
,然后是小写的第 2 组值。
查看 Notepad++ 演示屏幕:
您可以匹配大写字符、可选大写字符和可选小写字符的序列。
在替换中使用 _
后跟小写匹配 \L[=14=]
查找内容:
(?>,\h+[a-z]+|\G(?!^))\K[A-Z][A-Z]*[a-z]*
(?>
原子团,\h+[a-z]+
匹配逗号、1 个或多个空格和 1 个或多个小写字符|
或\G(?!^)
断言当前位置在上一个匹配的末尾而不是在字符串的开头(因此交替的第一部分必须首先匹配)
)
关闭原子组\K
忘记目前匹配的是什么[A-Z][A-Z]*[a-z]*
匹配大写字符后跟可选的大小写字符
替换为:
_\L[=11=]
在不使用 \K
的情况下,您可以使用 2 个捕获组。
(?>(, [a-z]+)|\G(?!^))([A-Z][A-Z]*[a-z]*)
在替换中使用_\L