Vim捕获组正则表达式以替换最后的空白空间的驼峰大小写字符串

时间:2016-10-28 20:42:21

标签: regex vim camelcasing

我有这样一行代码:

variableInCamelCase <- map["variableInCamelCase"]

我需要这样做:

variable_In_Camel_Case <- map["variableInCameCase"]

只有第一个单词必须转换,我试图找到一个正则表达式,我需要在Vim中进行,但我不能。 像这样的正则表达式:

var rex = /([A-Z])([A-Z])([a-z])|([a-z])([A-Z])/g;

"CSVFilesAreCoolButTXT".replace( rex, '$1$4_$2$3$5' );

不好,因为我只需要在第一个单词上做。另外,我需要它用于VIM,它使用特殊语法来捕获一个组。

我尝试了类似这样的事情:s/\(\l\)\(\u\)/\1_\2/g,相当于([a-z])([A-Z]),但我无法将其与([A-Z])([A-Z])([a-z])

进行对比

对于我的问题,有人有一个很好的vim准备正则表达式?也欢迎解释。

1 个答案:

答案 0 :(得分:1)

我有两个命令要从snake_caseUpperCamelCase转换为lowerCamelCase,反之亦然,转换为lh-dev。一个适用于当前单词,另一个适用于substitute。实际上,如果为当前项目配置库( - &gt;变量,属性,常量,getter,类型等),可以使用更多命名选项。

它是如何工作的?好吧,在CamelCase - &gt;的情况下使用lh#dev#naming#to_underscore()函数snake case

实际上这个很简单:

" Function:lh#dev#naming#to_underscore(identifier)         {{{3
function! lh#dev#naming#to_underscore(identifier)
  " first I make sure the first letter is in lower case
  let identifier = substitute(a:identifier, '\%(^\|[^A-Za-z0-9]\)\zs\(\u\)', '\l\1', '')
  " then I replace uppercase letters by '_' + their lower case flavour
  let identifier = substitute(identifier, '\l\zs\(\u\)', '_\l\1', 'g')
  return identifier
endfunction

然后,:[range]ConvertNames/pattern/policy/flag将转换为:[range]substitute/pattern/\=lh#dev#naming#{snake}(submatch(0))/flags

使用像\w\+这样的通用模式,它会对找到的第一个单词应用转换 - 转换正在用其蛇形表替换找到的单词。