Напишите функцию для преобразования текста CamelCased в snake_case: FunctionForHTMLManipulation
становитсяfunction_for_html_manipulation
Входной текст будет одним подходящим идентификатором на многих языках. Он должен начинаться с английской буквы, а затем следовать за любым количеством английских букв или цифр. Другие символы (пробелы, символы и т. Д.) Не допускаются.
Каждое «слово» в тексте в формате CamelCase будет начинаться с заглавной буквы, кроме как в начале текста или сразу после цифры, и после него будет следовать ноль или более букв, все в одном и том же регистре. Группы цифр будут рассматриваться как отдельные слова, но проходить без изменений.
Другими словами, строчная буква, за которой следует заглавная буква, обозначает разрыв слова. Любая буква и цифра рядом друг с другом указывают на разрыв слова. Заглавная буква, за которой следуют еще одна заглавная буква и строчная буква, обозначает разрыв слова.
...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
.
MACDonaldAndOBrian
становитсяmac_donald_and_o_brian
» - почему?...UUl...
=>...u_ul...
....
указывает, что это в середине строки.Ответы:
Retina ,
6137 байтПопробуйте онлайн! (Немного изменен для запуска полного набора тестов.)
объяснение
Вместо того, чтобы находить границы слов для вставки подчеркивания, мы просто сопоставляем каждое слово и добавляем a
_
. Сопоставление слов слева немного раздражает из-заUUl
правила, но, используя сопоставление справа налево в .NET, мы можем легко сопоставить слова жадно. Чтобы избежать лидерства_
, мы используем ограничения Retina.r
Активирует режим правого на левый, то1>
говорит Retina в процессе все , кроме первого матча (считая слева направо). Тогда есть четыре типа «слова»:Ulll
,lll
,UUU
,ddd
. Они легко соответствуют данному шаблону. Подстановка просто записывает_
сопровождаемое само слово.Это просто превращает верхний регистр в нижний регистр, чтобы завершить преобразование.
источник
JavaScript (ES6), 79 байт
источник
JavaScript (ES6), 89 байт
источник
Powershell, 77 байт
На основании ответа Нейла .
Менее гольф тестовый скрипт:
Выход:
источник
Сетчатка , 62 байта
Бесстыдно переводится с решения JavaScript .
Попробуйте онлайн!
источник
PowerShell,
6892 байтаКратко удалено, +24 байта за неправильное использование RegEx.
Попробуйте онлайн!
В основном так же, как решения JavaScript.
источник
buy24beers
иMACDonaldAndOBrian
. Сожалею.Фактор, 140 байт
Ungolfed:
источник
Lua , 135 байт
Попробуйте онлайн!
Это решение использует сокращенную запись Lua для классов символов C (строчные
%l
, прописные%u
, буквенные%a
, цифровые%d
), граничную запись (%f[]
) и все совпадения, добавляемые в качестве неявного первого захвата в отсутствие других захватов.источник
Python 2 , 82 байта
Попробуйте онлайн!
источник