Existe-t-il un moyen de diviser les mots en CamelCase aux limites "internes" des mots dans un texte ?
Par exemple, étant donné la chaîne :
IamHelloTest forYou PickTest;
en entrée, je voudrais produire en sortie :
Iam
Hello
Test
for
You
Pick
Test
Mise à jour : maintenant que la question a de nombreuses réponses utiles, comment procéder pour inclure également les cas suivants ?
Entrée :
IamTestECHO TEST PickFoo BARFull;
Sortie souhaitée :
I
am
Test
ECHO
TEST
Pick
Foo
Bar
FULL
Mise à jour : comment procéder pour inclure également le trait de soulignement ?
Entrée :
IamTestECHO TEST PickFoo BARFull def_python_FunctionTwo;
Sortie souhaitée :
I
am
Test
ECHO
TEST
Pick
Foo
Bar
FULL
def
python
Function
Two
Réponse acceptée :
Pour traiter votre deuxième exemple, suggérez une approche plus "basée sur des règles".
Considérez le script Perl suivant (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 #
- Ligne 1 :utilisez Unicode (pour traiter les accents, cyrillique)
- Ligne 2 :remplacez les non-lettres par "\n"
- ligne 3,4,5 : règles break-intraWord (définies par le contexte gauche, le contexte droit)
- ligne 5 :règles d'exception pour "Iam"
- ligne 5 :
x
option permet d'ajouter des commentaires dans les expressions régulières
Après l'habituel chmod +x camelcaseproc
nous pouvons l'utiliser comme :
$ camelcaseproc <<< "IamTestECHO TEST PickFoo BARFull"
I-am-Test-ECHO-TEST-Pick-Foo-BAR-Full
$ camelcaseproc input-file
$ echo "IamTestECHO TEST PickFoo BARFull" | camelcaseproc