Existuje způsob, jak rozdělit slova CamelCase na „vnitřních“ hranicích slov v textu?
Například zadaný řetězec:
IamHelloTest forYou PickTest;
jako vstup bych chtěl produkovat jako výstup:
Iam
Hello
Test
for
You
Pick
Test
Aktualizace: Nyní, když má otázka mnoho užitečných odpovědí, jak bych měl postupovat, abych zahrnul i následující případy?
Vstup:
IamTestECHO TEST PickFoo BARFull;
Požadovaný výstup:
I
am
Test
ECHO
TEST
Pick
Foo
Bar
FULL
Aktualizace: jak mám postupovat, abych zahrnul i podtržítko?
Vstup:
IamTestECHO TEST PickFoo BARFull def_python_FunctionTwo;
Požadovaný výstup:
I
am
Test
ECHO
TEST
Pick
Foo
Bar
FULL
def
python
Function
Two
Přijatá odpověď:
Chcete-li se vypořádat s vaším druhým příkladem, navrhněte přístup více „založený na pravidlech“.
Zvažte následující skript v Perlu (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 #
- Řádek 1:použijte Unicode (pro zpracování akcentů, azbuku)
- Řádek 2:nahraďte jiná než písmena „\n“
- řádek 3,4,5:pravidla pro přerušení slova (definovaná levým kontextem, pravým kontextem)
- řádek 5:pravidla výjimek pro „Iam“
- řádek 5:
x
možnost umožňuje přidávat komentáře v regulárních výrazech
Po obvyklém chmod +x camelcaseproc
můžeme jej použít jako:
$ camelcaseproc <<< "IamTestECHO TEST PickFoo BARFull"
I-am-Test-ECHO-TEST-Pick-Foo-BAR-Full
$ camelcaseproc input-file
$ echo "IamTestECHO TEST PickFoo BARFull" | camelcaseproc