从camelCase到SNAKE_CASE的所有文本

问题描述 投票:0回答:2

我正在尝试使用 Notepad++ 宏进行一些文本操作。我的最后一步是将驼峰式字符串转换为 SNAKE_CASE。到目前为止还没有运气。我对正则表达式不太熟悉,所以无法编写自己的解决方案。

文本文件输入示例:

firstLine(874),
secondLine(15),
thirdLineOfText87(0x0001);

所需输出:

FIRST_LINE(874),
SECOND_LINE(15),
THIRD_LINE_OF_TEXT_87(0x0001);

正则表达式或任何插件都是可以接受的答案。

regex notepad++ camelcasing snakecasing
2个回答
36
投票

我建议使用以下正则表达式方法:

查找内容:     

(\b[a-z]+|\G(?!^))((?:[A-Z]|\d+)[a-z]*)

替换为
\U\1_\2

匹配案例ON

这会将

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
反向引用插入)。


1
投票

还有一个替代解决方案。我的意思是,它不仅保存数字,还保存缩写(在 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
  • 匹配案例: ON

我在php函数preg_replace的文档页面上找到了这个解决方案:https://www.php.net/manual/en/function.preg-replace.php#111695.

© www.soinside.com 2019 - 2024. All rights reserved.