CamelCase2snake_case ()


13

CamelCased पाठ को snake_case में बदलने के लिए एक फ़ंक्शन लिखें: FunctionForHTMLManipulationबन जाता हैfunction_for_html_manipulation

इनपुट पाठ कई भाषाओं में एक एकल उपयुक्त पहचानकर्ता होगा। यह एक अंग्रेजी अक्षर से शुरू होना चाहिए, फिर किसी भी अंग्रेजी अक्षर या अंक के बाद होना चाहिए। कोई अन्य वर्ण (रिक्त स्थान, प्रतीक, आदि) की अनुमति नहीं है।

कैमलकेड पाठ के भीतर प्रत्येक "शब्द" एक बड़े अक्षर के साथ शुरू होगा जब तक कि पाठ की शुरुआत में या एक अंक के तुरंत बाद, और शून्य या अधिक अक्षरों का पालन न हो, सभी एक ही मामले में। अंकों के समूहों को अलग-अलग शब्दों के रूप में माना जाएगा, लेकिन अपरिवर्तित से होकर गुजरेंगे।

दूसरे शब्दों में, एक अपरकेस अक्षर के बाद एक अपरकेस अक्षर एक शब्द विराम को इंगित करता है। एक-दूसरे के आगे कोई भी अक्षर और अंक शब्द के टूटने का संकेत देता है। एक अपरकेस अक्षर के बाद दूसरा अपरकेस लेटर और लोअरकेस अक्षर एक शब्द विराम को दर्शाता है।

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

दोनों Buy24Beersऔर buy24beersबन जाते हैं buy_24_beers
MacDonaldAndObrianबन जाता है mac_donald_and_obrian
MACDonaldAndOBrianबन जाता है mac_donald_and_o_brian


6
" MACDonaldAndOBrianबन जाता है mac_donald_and_o_brian" - क्यों?
क्वाटर्ली

2
@Qwertiy क्योंकि मैंने सोचा था कि वे नाम मज़ेदार होंगे। जब तक आप नियम के बारे में नहीं पूछ रहे हैं, जो ...UUl...=> द्वारा कवर किया गया है ...u_ul...
सीजे डेनिस


@DigitalTrauma आश्चर्यजनक रूप से मेरे मूल प्रश्न के करीब है, लेकिन एक में दो प्रश्न होने और कोई डाउनवॉट न होने की शिकायतों के बिना! ALLCAPS स्ट्रिंग्स के उपचार में सबसे बड़ा अंतर है। मैंने यह देखने के लिए खोज की कि क्या प्रश्न पहले पूछा गया था, लेकिन मुझे नहीं मिला।
सीजे डेनिस

1
@ggorlen ...इंगित करता है कि यह एक स्ट्रिंग के बीच में है।
सीजे डेनिस

जवाबों:


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>पहले मैच (से गिनती बाएं से दाएं) को छोड़कर प्रक्रिया सब कुछ करने के लिए रेटिना बताता है। तो फिर वहाँ "शब्दों" के चार प्रकार है: Ulll, lll, UUU, ddd। ये दिए गए पैटर्न के साथ आसानी से मेल खाते हैं। प्रतिस्थापन केवल _शब्द के बाद लिखा जाता है।

T`L`l

यह रूपांतरण को पूरा करने के लिए ऊपरी मामले को निचले मामले में बदल देता है।


6

जावास्क्रिप्ट (ईएस 6), 79 बाइट्स

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

3

जावास्क्रिप्ट (ईएस 6), 89 बाइट्स

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

2

पॉवरशेल, 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

पॉवरशेल, 68 92 बाइट्स

संक्षिप्त रूप से, गलत RegEx का उपयोग करने के लिए +25 बाइट्स।

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

इसे ऑनलाइन आज़माएं!

मूल रूप से जावास्क्रिप्ट समाधान के समान है।


यह buy24beersऔर के साथ काम नहीं करता है MACDonaldAndOBrian। माफ़ करना।
माज़ी

1
@ माज़ी तय, धन्यवाद
गेब्रियल मिल्स

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

लूआ , 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

इसे ऑनलाइन आज़माएं!

यह समाधान सी के चरित्र वर्गों (लोअरकेस %l, अपरकेस %u, अल्फ़ाबेटिक %a, अंक %d), फ्रंटियर नोटेशन ( %f[]) के लिए लुआ की शॉर्टहैंड नोटेशन से लाभ होता है , और पूरे मैच से किसी अन्य कैप्चर के अभाव में निहित पहले कैप्चर के रूप में जोड़ा जा रहा है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.