2014-04-05 45 views
2

我在尝试修改cla代码段,但也失败了。如何camelcase文件名?

这是段

snippet cla class .. end 
class ${1:`substitute(Filename(), '^.', '\u&', '')`} 
    ${2} 

它自动进行文件名,并将其转换这样

this_is_filename.rb => This_is_filename 

我不喜欢它。我宁愿要它像

this_is_filename.rb => ThisIsFilename 

如何做到这一点?

+0

你在做什么语言?像['(?<= \ A | _)(\ w)'](http://regex101.com/r/jX7gG6)这样的正则表达式可以工作,但是您仍然需要大写匹配组并且移除剩下的'_'。 “PascalCase”为 – Sam

回答

3

该功能可将文件名以驼峰

substitute(Filename(), '_\(.\)', '\U\1', 'g') 

但是它看起来像你想PascalCase。这应该适用于PascalCase

substitute(Filename(), '\%(^\|_\)\(.\)', '\U\1', 'g') 
+0

+ 1,从未听说过。 –

0

不知道你用的是什么语言,但(?:\A|_)(\w)将拍摄到具有_后跟一个字母沿着第一个字母。但是,只有字母(在字符串的开头或_后面)才会出现在匹配组中。这意味着对于字符串this_is_filename.rb,您将匹配t(组1:t),_i(组1:i)和_f(组1:f)。然后,您可以用第一组的大写版本替换匹配。对不起,我没有一个更好的例子,但在PHP中,你可以这样做:

echo preg_replace_callback(
    '/(?:\A|_)(\w)/', 
    function($matches) { 
     return strtoupper($matches[1]); 
    }, 
    'this_is_filename.rb' 
); 

这个表达式的工作原理是采集一个字符串或者开始(\A)或在非捕获组下划线,其次是包装在第一个匹配组中的“单词”字符(\w)。这样你就可以用第一个匹配组的大写版本替换下划线和字符。

+1

他正在使用vim。它有自己的正则表达式语言。 – FDinoff

+0

@FDinoff这就是它的样子,但是我不知道':%s/pattern/replace/g'语法之外的任何东西。希望我的回答仍然有一些帮助。 – Sam

+1

看看':h substitute()'它基本上只是命令行函数,除了它是一个函数并且它取代了它应该替换的东西。 – FDinoff