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


@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>говорить Retina в процесі все , крім першого матчу (рахуючи зліва направо). Тоді є чотири типи «слова»: Ulll, lll, UUU, ddd. Вони легко узгоджуються із заданим малюнком. Заміна просто пише _слідом за самим словом.

T`L`l

Це просто перетворює верхній регістр у нижній регістр, щоб завершити трансформацію.



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


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. Вибачте.
маззи

1
@mazzy виправлено, спасибі
Габріель Міллс

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

Спробуйте в Інтернеті!

Це рішення виграє від скороченого позначення Lua для класів символів C (малі %l, великі %u, алфавітні %a, цифри %d), позначення кордону ( %f[]), а також додається до цілого матчу як неявна перша фіксація за відсутності будь-яких інших захоплень.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.