CamelCase2snake_case()


13

编写将CamelCased文本转换为snake_case的函数:FunctionForHTMLManipulation变成function_for_html_manipulation

输入文本将是多种语言的单个合适的标识符。它必须以英文字母开头,然后是任意数量的英文字母或数字。不允许使用其他字符(空格,符号等)。

CamelCased文本中的每个“单词”都将以大写字母开头,除非在文本开头或紧跟在数字之后,然后是零个或多个字母(大小写均相同)。数字组将被视为单独的单词,但将保持不变。

换句话说,小写字母后跟大写字母表示分词。彼此相邻的任何字母和数字都表示分词。大写字母后跟另一个大写字母和小写字母表示单词中断。

...lU...=> ...l_u...
...l9...=> ...l_9...
...U9...=> ...u_9...
...9l...=> ...9_l...
...9U...=> ...9_u...
...UUl...=>...u_ul...

双方Buy24Beersbuy24beers成为buy_24_beers
MacDonaldAndObrian成为mac_donald_and_obrian
MACDonaldAndOBrian成为mac_donald_and_o_brian


6
MACDonaldAndOBrian变成mac_donald_and_o_brian -为什么?
Qwertiy '16

2
@Qwertiy因为我认为这些名字会很有趣。除非您询问有关规则,否则该规则将被...UUl...=> 覆盖...u_ul...
CJ Dennis


@DigitalTrauma非常接近我的原始问题,但没有抱怨两个问题合而为一,没有下注!最大的区别在于ALLCAPS字符串的处理。我搜寻了是否曾问过这个问题,但没有找到。
CJ Dennis

1
@ggorlen ...表示它在字符串中间。
CJ丹尼斯

Answers:


7

视网膜61 37字节

r1>`[A-Z]?[a-z]+|[A-Z]+|\d+
_$&
T`L`l

在线尝试!(稍作修改即可运行完整的测试套件。)

说明

无需查找单词边界来插入下划线,我们只需匹配每个单词并在其前面添加一个即可_。由于UUl规则的原因,从左边匹配单词有点烦人,但是使用.NET的从右到左匹配,我们可以轻松地贪婪地匹配单词。为了避免领先_,我们使用了视网膜的极限。

r1>`[A-Z]?[a-z]+|[A-Z]+|\d+
_$&

所述r激活右到左的模式时,1>告诉视网膜过程以外的所有第一匹配(计数从左至右)。然后有四种类型的“字”: ,Ullllll,。UUU ddd这些很容易与给定的模式匹配。替换只写一个“ a”,_后跟单词本身。

T`L`l

只需将大写变成小写即可完成转换。


6

JavaScript(ES6),79个字节

s=>s.match(/[A-Z]+(?=[A-Z][a-z]|\d|$)|[A-Z]?[a-z]+|\d+/g).join`_`.toLowerCase()

3

JavaScript(ES6),89个字节

s=>s.replace(/\d(?=\D)|\D(?=\d)|[a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z])/g,"$&_").toL‌​owerCase()

2

Powershell,77个字节

根据Neil的回答

$args-creplace'\d(?=\D)|\D(?=\d)|[a-z](?=[A-Z])|.(?=[A-Z][a-z])','$&_'|% *wer

少打高尔夫的测试脚本:

$f = {

$args-creplace'\d(?=\D)|\D(?=\d)|[a-z](?=[A-Z])|.(?=[A-Z][a-z])','$&_'|% toLower

}

@(
    ,("Buy24Beers", "buy_24_beers")
    ,("buy24beers", "buy_24_beers")
    ,("MacDonaldAndObrian", "mac_donald_and_obrian")
    ,("MACDonaldAndOBrian", "mac_donald_and_o_brian")
    ,("BigD", "big_d")
) | % {
    $s,$expected = $_
    $result = &$f $s
    "$($result-ceq$expected): $result"
}

输出:

True: buy_24_beers
True: buy_24_beers
True: mac_donald_and_obrian
True: mac_donald_and_o_brian
True: big_d



0

因子140字节

[ R/ [a-z][A-Z][a-z]/ [ dup from>> swap dup to>> swap seq>> subseq R/ [A-Z][a-z]/ [ "_" prepend ] re-replace-with ] re-replace-with >lower ]

取消高尔夫:

: slice>subseq ( slice -- subseq )
dup from>> swap dup to>> swap seq>> subseq ;

: camel-case>snake-case ( string -- string' )
    R/ [a-z][A-Z][a-z]/ [
        slice>subseq R/ [A-Z][a-z]/
        [ "_" prepend ] re-replace-with
    ] re-replace-with >lower ;

0

Lua 135字节

function snake(s)return s:gsub('%f[^%l]%u','_%1'):gsub('%f[^%a]%d','_%1'):gsub('%f[^%d]%a','_%1'):gsub('(%u)(%u%l)','%1_%2'):lower()end

在线尝试!

该解决方案得益于Lua对C的字符类的缩写符号(小写%l,大写%u,字母%a,数字%d),边界符号(%f[]),并且在没有任何其他捕获的情况下,将整个匹配项添加为隐式第一捕获。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.