Escriba una función para convertir texto CamelCased a snake_case: se FunctionForHTMLManipulation
conviertefunction_for_html_manipulation
El texto de entrada será un único identificador adecuado en muchos idiomas. Debe comenzar con una letra en inglés, luego debe seguir cualquier número de letras o dígitos en inglés. No se permiten otros caracteres (espacios, símbolos, etc.).
Cada "palabra" dentro del texto CamelCased comenzará con una letra mayúscula a menos que sea al comienzo del texto o inmediatamente después de un dígito, y será seguida por cero o más letras, todas en el mismo caso. Los grupos de dígitos se considerarán como palabras separadas pero pasarán sin cambios.
En otras palabras, una letra minúscula seguida de una letra mayúscula indica un salto de palabra. Cualquier letra y dígito uno al lado del otro indica un salto de palabra. Una letra mayúscula seguida de otra letra mayúscula y una letra minúscula indican un salto de palabra.
...lU...
=> ...l_u...
...l9...
=> ...l_9...
...U9...
=> ...u_9...
...9l...
=> ...9_l...
...9U...
=> ...9_u...
...UUl...
=>...u_ul...
Ambos Buy24Beers
y buy24beers
convertirse buy_24_beers
.
MacDonaldAndObrian
se convierte mac_donald_and_obrian
.
MACDonaldAndOBrian
se convierte mac_donald_and_o_brian
.
MACDonaldAndOBrian
conviertemac_donald_and_o_brian
" - ¿por qué?...UUl...
=>...u_ul...
....
indica que está en el medio de una cadena.Respuestas:
Retina ,
6137 bytesPruébalo en línea! (Ligeramente modificado para ejecutar un conjunto de pruebas completo).
Explicación
En lugar de encontrar límites de palabras para insertar guiones bajos, simplemente hacemos coincidir cada palabra y anteponemos a
_
. Coincidir palabras desde la izquierda es un poco molesto debido a laUUl
regla, pero usando la correspondencia de derecha a izquierda de .NET podemos unir fácilmente las palabras con avidez. Para evitar una ventaja_
, hacemos uso de los límites de Retina.La
r
activa el modo de derecha a izquierda, el1>
dice Retina de proceso de todo excepto el primer partido (conteo de izquierda a derecha). Entonces hay cuatro tipos de "palabras":Ulll
,lll
,UUU
,ddd
. Estos se combinan fácilmente con el patrón dado. La sustitución solo escribe un_
seguido por la palabra misma.Esto simplemente convierte mayúsculas en minúsculas para completar la transformación.
fuente
JavaScript (ES6), 79 bytes
fuente
JavaScript (ES6), 89 bytes
fuente
Powershell, 77 bytes
Basado en la respuesta de Neil .
Menos guión de prueba de golf:
Salida:
fuente
Retina , 62 bytes
Traducida descaradamente de la solución de JavaScript .
Pruébalo en línea!
fuente
PowerShell,
6892 bytesBrevemente eliminado, +24 bytes por usar el RegEx incorrecto.
Pruébalo en línea!
Básicamente lo mismo que las soluciones de JavaScript.
fuente
buy24beers
yMACDonaldAndOBrian
. Lo siento.Factor, 140 bytes
Sin golf:
fuente
Lua , 135 bytes
Pruébalo en línea!
Esta solución se beneficia de la notación abreviada de Lua para las clases de caracteres de C (minúscula
%l
, mayúscula%u
, alfabético%a
, dígito%d
), notación de frontera (%f[]
) y de que toda la coincidencia se agrega como la primera captura implícita en ausencia de otras capturas.fuente
Python 2 , 82 bytes
Pruébalo en línea!
fuente