我正在尝试使用 Notepad++ 宏进行一些文本操作。我的最后一步是将驼峰式字符串转换为 SNAKE_CASE。到目前为止还没有运气。我对正则表达式不太熟悉,所以无法编写自己的解决方案。
文本文件输入示例:
firstLine(874),
secondLine(15),
thirdLineOfText87(0x0001);
所需输出:
FIRST_LINE(874),
SECOND_LINE(15),
THIRD_LINE_OF_TEXT_87(0x0001);
正则表达式或任何插件都是可以接受的答案。
我建议使用以下正则表达式方法:
查找内容:
(\b[a-z]+|\G(?!^))((?:[A-Z]|\d+)[a-z]*)
\U\1_\2
这会将
camelCase87LikeThis
单词变成 CAMEL_CASE_87_LIKE_THIS
。如果您需要添加对以大写字母开头的驼峰词的支持,请使用以下正则表达式修改:
(\G(?!^)|\b[a-zA-Z][a-z]*)([A-Z][a-z]*|\d+)
请参阅 regex 演示(也在 Notepad++ 中进行了测试)。请注意正则表达式中
\G
的位置并添加了 A-Z
。
详情:
(\b[a-z]+|\G(?!^))
- 第 1 组捕获两种选择之一:
\b[a-z]+
- 单词的开头(\b
是此处的初始单词边界),后跟 1+ 个小写 ASCII 字母|
- 或\G(?!^)
- 上一次成功匹配的结束位置((?:[A-Z]|\d+)[a-z]*)
- 第 2 组捕获:
(?:[A-Z]|\d+)
- 大写 ASCII 字母 ([A-Z]
) 或 (|
) 1 个以上数字 (\d+
)[a-z]*
- 0+ 个小写 ASCII 字母。\U\1_\2
替换模式使用 \U
将所有字符转换为大写,并在两组之间插入 _
(使用 \1
和 \2
反向引用插入)。
还有一个替代解决方案。我的意思是,它不仅保存数字,还保存缩写(在 PHP 中):
preg_replace(
'/(?<!^)([A-Z][a-z]|(?<=[a-z])[^a-z]|(?<=[A-Z])[0-9_])/',
'_$1',
$str
)
此正则表达式适用于这些情况:
'fat' ---> 'fat'
'fatBat' ---> 'fat_bat'
'FatBat' ---> 'fat_bat'
'camera360' ---> 'camera_360'
'camera360all' ---> 'camera_360all'
'camera360All' ---> 'camera_360_all'
'cameraABC' ---> 'camera_abc'
'cameraABCAll' ---> 'camera_abc_all'
'thirdLineOfText87' ---> 'third_line_of_text_87'
此解决方案为小写。但如果我们想要大写,我们可以使用
\U
-修饰符,如上面在 notepad++ 中的解决方案所示:
/(?<!^)([A-Z][a-z]|(?<=[a-z])[^a-z]|(?<=[A-Z])[0-9_])/
_\1
我在php函数preg_replace的文档页面上找到了这个解决方案:https://www.php.net/manual/en/function.preg-replace.php#111695.