2013-03-05 5 views
19

Sto cercando di effettuare una scissione simile alla seguente:Groovy/Java diviso stringa su parentesi "("

println "Hello World(1)".split("W"); 

uscita:

[Hello , orld(1)] 

voglio eseguire questa scissione:

println "Hello World(1)".split("("); 

Ma vedo:

Caught: java.util.regex.PatternSyntaxException: Unclosed group near index 1 (

Esiste un modo per evitare questa parentesi? Qualsiasi aiuto è apprezzato.

+1

avete bisogno di sfuggire in questo modo '\\ (' – ant

+1

che sfuggono non funziona @ant –

+1

scusate barra doppia back – ant

risposta

40
println "Hello World(1)".split("\\("); 
+0

Questo lo fa per me, grazie! Stavo provando solo \ –

17

Il metodo split utilizza uno schema di espressione regolare.

Se si desidera dividere in "solo una stringa regolare" è possibile utilizzare Pattern.quote citare la stringa prima:

println "Hello World(1)".split(Pattern.quote("(")) 
+0

oppure è possibile dividere in '" \\ ("', che prima fugge '\\ (' a '\ (', quindi il motore regex evapora '\ (' a a parentesi letterale – jedyobidan

+0

Questo è interessante .. Non ho pensato di usare Pattern.quote() in questa circostanza. Buona risposta Jon –

+0

@jedyobidan: Beh, questo è esattamente ciò che farà 'Pattern.quote' - significa solo che non hai bisogno di farlo manualmente ... –

0

si deve sfuggire il carattere parentesi correttamente

println "Hello World(1)".split("\\(") 
1

È anche possibile utilizzare una singola uscita quando si utilizza la sintassi regex nativa di groovy:

assert "Hello World(1)".split(/\(/) == ["Hello World", "1)"] 
0

Dal split è sufficiente accettare regex, è necessario passare ad esso come carattere di escape. Per questo, è necessario aggiungere una barra rovesciata di fronte ad essa

\(

Ma soprattutto ha un errore di compilazione perché viene analizzato come una valida sfuggito carattere come ad esempio:

\t Tab 
\n New Line or Line Feed 
\r Carriage Return 

Quindi, è necessario passare un carattere non senso (Eg parentesi) con 2 backslash:

\\(

Infine:

println "Hello World(1)".split("\\("); 

o si può anche fare tutte le cose da Java incorporato funzione di classe modello nome citazione:

println "Hello World(1)".split(Pattern.quote("("));