CamelCase2snake_case ()


13

snake_case에 낙타 표기법 텍스트를 변환하는 함수를 작성 : FunctionForHTMLManipulation이된다function_for_html_manipulation

입력 텍스트는 여러 언어에서 적합한 단일 식별자입니다. 영어 문자로 시작한 다음 영어 문자 나 숫자를 입력해야합니다. 다른 문자 (공백, 기호 등)는 허용되지 않습니다.

CamelCased 텍스트 내의 각 "단어"는 텍스트의 시작 부분이나 숫자 바로 뒤에 있지 않는 한 대문자로 시작하며, 모두 같은 경우 0 개 이상의 문자가 뒤 따릅니다. 숫자 그룹은 별도의 단어로 간주되지만 변경되지 않습니다.

즉, 소문자 뒤에 대문자가 있으면 단어 구분이 나타납니다. 서로 옆에있는 문자와 숫자는 단어 구분을 나타냅니다. 대문자 뒤에 다른 대문자와 소문자가 오는 것은 단어 구분을 나타냅니다.

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

둘 다 Buy24Beersbuy24beersbuy_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 놀랍게도 내 원래의 질문에 가까웠지만 하나의 질문에 두 개의 질문이 있고 다운 투표자가 없다는 불만은 없습니다! 가장 큰 차이점은 ALLCAPS 문자열 처리에 있습니다. 질문이 이전에 요청되었는지 확인했지만 찾지 못했습니다.
CJ Dennis

1
@ggorlen은 ...문자열 중간에 있음을 나타냅니다.
CJ Dennis

답변:


7

망막 , 61 37 바이트

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

온라인으로 사용해보십시오! 전체 테스트 스위트를 실행하도록 약간 수정되었습니다.

설명

밑줄을 삽입 할 단어 경계를 찾는 대신 각 단어를 일치시키고 앞에 붙입니다 _. 왼쪽에서 단어를 일치시키는 것은 UUl규칙 때문에 약간 성가 시지만 .NET의 오른쪽에서 왼쪽으로 일치를 사용하면 단어를 탐욕스럽게 쉽게 일치시킬 수 있습니다. 선행을 피하기 위해 _Retina의 한계를 사용합니다.

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

r는 오른쪽에서 왼쪽 모드를 활성화 1>첫 경기 (왼쪽에서 오른쪽으로 계산)을 제외한 공정 모든 것을 망막을 알려줍니다. 그런 다음 "단어"의 네 가지 유형이있다 : Ulll, lll, UUU, ddd. 이들은 주어진 패턴과 쉽게 일치합니다. 대체는 그 _뒤에 단어 자체를 씁니다 .

T`L`l

변환을 완료하기 위해 대문자를 소문자로 바꿉니다.


6

자바 스크립트 (ES6), 79 바이트

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

3

자바 스크립트 (ES6), 89 바이트

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

2

파워 쉘, 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


1

PowerShell, 68 92 바이트

잘못된 RegEx를 사용하기 위해 +24 바이트를 간단히 삭제했습니다.

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

온라인으로 사용해보십시오!

기본적으로 JavaScript 솔루션과 동일합니다.


그것은 작동하지 않습니다 buy24beersMACDonaldAndOBrian. 죄송합니다.
mazzy

1
@mazzy 고정, 감사합니다.
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 ]

언 골프 드 :

: 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

온라인으로 사용해보십시오!

이 솔루션은 C의 문자 클래스 (소문자 %l, 대문자 %u, 알파벳 %a, 숫자 %d), 프론티어 표기법 ( %f[]) 및 다른 캡처없이 암시 적 첫 번째 캡처로 추가 된 전체 경기 에서 Lua의 속기 표기법을 활용 합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.