CamelCase2snake_case()


13

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

2
@Qwertiyこれらの名前は楽しいと思ったからです。...UUl...=>でカバーされているルールについて尋ねている場合を除きます...u_ul...
CJデニス


@DigitalTrauma私の元の質問に驚くほど近いが、1つの質問に2つの質問があり、下票がないという不満がない!最大の違いは、ALLCAPS文字列の処理です。質問が以前に聞かれたかどうかを調べてみましたが、見つかりませんでした。
CJデニス

1
@ggorlen ...は、文字列の途中にあることを示します。
CJデニス

回答:


7

網膜61 37バイト

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

オンラインでお試しください!(完全なテストスイートを実行するために少し変更されています。)

説明

単語の境界を見つけてアンダースコアを挿入する代わりに、各単語に一致させてaを付加し_ます。UUlルールのため、左からの単語の一致は少し面倒ですが、.NETの右から左への一致を使用すると、単語を貪欲に簡単に一致させることができます。先行を回避するために、_Retinaの制限を利用します。

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

r右から左へのモードをアクティブにし1>、最初の一致(左から右へカウント)を除くすべてを処理するようRetinaに指示します。そして、「言葉」の4種類があります:UllllllUUUddd。これらは、指定されたパターンと簡単に一致します。置換は、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バイト

ニールの答えに基づきます

$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

オンラインでお試しください!

このソリューションは、Cの文字クラス(小文字%l、大文字%u、アルファベット%a、数字%d)のLuaの短縮表記、フロンティア表記(%f[])、および他のキャプチャがない場合の暗黙的な最初のキャプチャとして一致全体が追加されるという利点があります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.