如何使用正则表达式在 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=]

Regex demo


在不使用 \K 的情况下,您可以使用 2 个捕获组。

(?>(, [a-z]+)|\G(?!^))([A-Z][A-Z]*[a-z]*)

在替换中使用_\L