¿Hay alguna manera de dividir las palabras de CamelCase en los límites de palabras "internos" en un texto?
Por ejemplo, dada la cadena:
IamHelloTest forYou PickTest;
como entrada, me gustaría producir como salida:
Iam
Hello
Test
for
You
Pick
Test
Actualización: ahora que la pregunta tiene muchas respuestas útiles, ¿cómo procedería para incluir también los siguientes casos?
Entrada:
IamTestECHO TEST PickFoo BARFull;
Salida deseada:
I
am
Test
ECHO
TEST
Pick
Foo
Bar
FULL
Actualización: ¿Cómo procedería para incluir también el guión bajo?
Entrada:
IamTestECHO TEST PickFoo BARFull def_python_FunctionTwo;
Salida deseada:
I
am
Test
ECHO
TEST
Pick
Foo
Bar
FULL
def
python
Function
Two
Respuesta aceptada:
Para lidiar con su segundo ejemplo, sugiera un enfoque más "basado en reglas".
Considere el siguiente script de Perl (camelcaseproc
):
#!/usr/bin/perl -CSDA -p
s{ \W+ # break on non-word
| _ # break on "_"
| (?<=\p{Ll})(?=\p{Lu}) # ...aB... → ...a-B...
| (?<=\p{Lu})(?=\p{Lu}\p{Ll}) # ..ABCd.. → ...AB-Cd.
| (?<=I)(?=am) # exceptions rules
}{-}xg #
- Línea 1:use Unicode (para procesar acentos, cirílico)
- Línea 2:sustituye las letras que no sean letras por "\n"
- línea 3,4,5:romper las reglas de intraWord (definidas por el contexto izquierdo, el contexto derecho)
- línea 5:reglas de excepción para "Soy"
- línea 5:
x
opción hace posible agregar comentarios en expresiones regulares
Después del habitual chmod +x camelcaseproc
podemos usarlo como:
$ camelcaseproc <<< "IamTestECHO TEST PickFoo BARFull"
I-am-Test-ECHO-TEST-Pick-Foo-BAR-Full
$ camelcaseproc input-file
$ echo "IamTestECHO TEST PickFoo BARFull" | camelcaseproc