2010-10-01 12 views
27

Próbuję podzielić String. Proste przykłady pracy:Grails: Dzielenie łańcucha zawierającego rurę

groovy:000> print "abc,def".split(","); 
[abc, def]===> null 
groovy:000> 

Ale zamiast przecinka, muszę podzielić ją na rurach, a ja nie dostaję pożądany rezultat:

groovy:000> print "abc|def".split("|"); 
[, a, b, c, |, d, e, f]===> null 
groovy:000> 

więc oczywiście mój pierwszy wybór byłby aby przełączyć z rur (|) na przecinki (,) jako ograniczniki.

Ale teraz jestem zaintrygowany: Dlaczego to nie działa? Uciekając rurę (\|) nie wydają się pomóc:

groovy:000> print "abc|def".split("\|"); 
ERROR org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed, groovysh_parse: 1: unexpected char: '\' @ line 1, column 24. 
    print "abcdef".split("\|"); 
         ^

1 error 
| 
     at java_lang_Runnable$run.call (Unknown Source) 
groovy:000> 

Odpowiedz

53

trzeba podzielić na \\|.

+0

mógłby Pan podać przykład? Czy to nie to samo, co podany ostatnio fragment kodu? – Tom

+0

@Tom, to był problem z formatowaniem, miał na myśli '\\ |'. Musisz wydostać się z '\ ', aby go zinterpretować w łańcuchu, aby mógł uciec przed' '' –

+0

@Colin Dziękuję bardzo. Nie udało się złapać tego problemu z formatowaniem. Przepraszam. – Tom

17

Musisz uciec z rury, ponieważ ma on specjalne znaczenie w wyrażeniu regularnym. Jednakże, jeśli używasz cudzysłowów, musisz także uciec z ukośnika. Zasadniczo, następnie dwie opcje:

asserts "abc|def".split("\\|") == ['abc','def'] 

lub używając / jako ciąg separatora, aby uniknąć dodatkowych ucieczek

asserts "abc|def".split(/\|/) == ['abc','def'] 
+0

Dzięki! '/' Wydaje się perly and familiar :) – Tom

+0

+1 za wyjaśnienie i poprawnie sformatowaną demonstrację. Nie wiem, dlaczego inną odpowiedzią jest uzyskanie całej miłości, ta jest o wiele lepsza. –

Powiązane problemy