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...

ทั้งสองBuy24Beersและกลายเป็นbuy24beers จะกลายเป็น จะกลายเป็น buy_24_beers
MacDonaldAndObrianmac_donald_and_obrian
MACDonaldAndOBrianmac_donald_and_o_brian


6
" MACDonaldAndOBrianกลายเป็นmac_donald_and_o_brian" - เพราะเหตุใด
Qwertiy

2
@Qwertiy เพราะฉันคิดว่าชื่อเหล่านั้นคงจะสนุก ถ้าคุณกำลังถามเกี่ยวกับการปกครองซึ่งถูกปกคลุมด้วย=>...UUl... ...u_ul...
CJ Dennis


@DigitalTrauma น่าประหลาดใจใกล้กับคำถามเดิมของฉัน แต่ไม่มีข้อร้องเรียนเกี่ยวกับการเป็นสองคำถามในหนึ่งเดียวและไม่มี downvotes! ความแตกต่างที่ยิ่งใหญ่ที่สุดคือการรักษาสตริง ALLCAPS ฉันค้นหาเพื่อดูว่าคำถามเคยถามมาก่อนหรือไม่ แต่ไม่พบ
CJ Dennis

1
@ggorlen ตัว...บ่งชี้ว่ามันอยู่ตรงกลางของสตริง
CJ Dennis

คำตอบ:


7

เรติน่า61 61ไบต์

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

ลองออนไลน์! (แก้ไขเล็กน้อยเพื่อรันชุดทดสอบเต็มรูปแบบ)

คำอธิบาย

แทนการหาขอบเขตของคำที่จะแทรกขีดเราก็ตรงกับแต่ละคำและย่อหน้า _การจับคู่คำจากด้านซ้ายนั้นค่อนข้างน่ารำคาญเนื่องจากUUlกฎ แต่การใช้การจับคู่จากขวาไปซ้ายของ. NET ทำให้เราสามารถจับคู่คำอย่างตะกละตะกลามได้อย่างง่ายดาย เพื่อหลีกเลี่ยงการนำ_เราใช้ประโยชน์จากขีด จำกัด ของจอประสาทตา

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

การrเปิดใช้งานโหมดจากขวาไปซ้าย1>บอกให้ Retina ประมวลผลทุกอย่างยกเว้นนัดแรก (นับจากซ้ายไปขวา) จากนั้นก็มีสี่ประเภทของ "คำว่า": Ulll, lll, ,UUU dddสิ่งเหล่านี้สามารถจับคู่กับรูปแบบที่กำหนดได้อย่างง่ายดาย การทดแทนเพียงแค่เขียน_ตามด้วยคำว่าตัวเอง

T`L`l

สิ่งนี้จะเปลี่ยนตัวพิมพ์ใหญ่เป็นตัวพิมพ์เล็กเพื่อให้การแปลงเสร็จสมบูรณ์




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


1

PowerShell, 68 92 ไบต์

ลบสั้น ๆ +24 ไบต์สำหรับการใช้ RegEx ผิด

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

ลองออนไลน์!

โดยพื้นฐานแล้วเหมือนกับโซลูชัน JavaScript


มันไม่ได้ทำงานกับและbuy24beers MACDonaldAndOBrianขอโทษ
mazzy

1
@ มาซี่คงที่ขอบคุณ
Gabriel Mills

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 ]

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 ไบต์

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[]) และจากการแข่งขันทั้งหมดที่ถูกเพิ่มเข้ามาเมื่อไม่มีการจับภาพอื่น


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.