CamelCase2snake_case ()


13

CamelCased metnini snake_case biçimine dönüştürmek için bir işlev yazın: FunctionForHTMLManipulationolurfunction_for_html_manipulation

Giriş metni birçok dilde tek bir uygun tanımlayıcı olacaktır. Bir İngilizce harfiyle başlamalı, ardından herhangi bir sayıda İngilizce harf veya rakam gelmelidir. Başka hiçbir karaktere (boşluk, sembol vb.) İzin verilmez.

CamelCased metnindeki her "kelime", metnin başında veya bir rakamdan hemen sonra büyük harfle başlar ve ardından aynı durumun tamamında sıfır veya daha fazla harf gelir. Rakam grupları ayrı kelimeler olarak kabul edilir, ancak değişmeden geçer.

Başka bir deyişle, bir küçük harf ve ardından bir büyük harf bir kelime sonu anlamına gelir. Yan yana bulunan herhangi bir harf ve rakam bir kelime ara olduğunu gösterir. Bir büyük harf ve ardından başka bir büyük harf ve küçük bir harf, bir sözcük ara olduğunu gösterir.

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

Her ikisi de Buy24Beersve buy24beersolur buy_24_beers.
MacDonaldAndObrianolur mac_donald_and_obrian.
MACDonaldAndOBrianolur mac_donald_and_o_brian.


6
" MACDonaldAndOBrianolur mac_donald_and_o_brian" - neden?
Qwertiy

2
@Qwertiy Çünkü bu isimlerin eğlenceli olacağını düşündüm. ...UUl...=> Kapsamındaki kuralı sormadığınız sürece ...u_ul....
CJ Dennis


@DigitalTrauma Şaşırtıcı şekilde orijinal soruma yakın, ancak tek soruda iki soru olmanın şikayeti olmadan ve aşağı oy yok! En büyük fark ALLCAPS dizelerinin tedavisinde. Sorunun daha önce sorulmuş olup olmadığını araştırdım ama bulamadım.
CJ Dennis

1
@ggorlen ...bir dizenin ortasında olduğunu gösterir.
CJ Dennis

Yanıtlar:


7

Retina , 61 37 bayt

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

Çevrimiçi deneyin! (Tam bir test paketini çalıştırmak için biraz değiştirildi.)

açıklama

Alt çizgi eklemek için sözcük sınırları bulmak yerine, her sözcüğü eşleştirip a'nın başına ekliyoruz _. Soldan kelimeleri eşleştirmek UUlkural nedeniyle biraz can sıkıcıdır , ancak .NET'in sağdan sola eşleşmesini kullanarak kelimeleri açgözlülükle kolayca eşleştirebiliriz. Liderlikten kaçınmak için _Retina sınırlarını kullanıyoruz.

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

r, Sağdan sola modu aktive 1>ilk maçında (soldan sağa sayma) hariç süreç her şeye Retina söyler. Daha sonra "kelimeleri" dört tip var: Ulll, lll, UUU, ddd. Bunlar verilen desenle kolayca eşleştirilir. İkame sadece bir _sözcüğün kendisini yazar .

T`L`l

Bu, dönüşümü tamamlamak için büyük harfleri küçük harfe dönüştürür.


6

JavaScript (ES6), 79 bayt

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

3

JavaScript (ES6), 89 bayt

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

2

Powershell, 77 bayt

Neil'in cevabına dayanarak .

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

Daha az golf test senaryosu:

$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"
}

Çıktı:

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


1

PowerShell, 68 92 bayt

Kısaca silindi, yanlış RegEx'i kullanmak için +24 bayt.

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

Çevrimiçi deneyin!

Temel olarak JavaScript çözümleriyle aynı.


O çalışmaz buy24beersve MACDonaldAndOBrian. Üzgünüm.
mazzy

1
@mazzy düzeltildi, teşekkürler.
Gabriel Mills

0

Faktör, 140 bayt

[ 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 ]

Ungolfed:

: 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 bayt

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

Çevrimiçi deneyin!

Bu çözüm, Lua'nın C'nin karakter sınıfları (küçük harf %l, büyük harf %u, alfabetik %a, rakam %d), sınır gösterimi ( %f[]) için kısa gösterimden ve diğer tüm yakalamaların yokluğunda örtülü ilk yakalama olarak eklenen tüm maçtan yararlanır.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.