Perché non funziona?Groovy: Perché devo raddoppiare le parentesi quadre?
"hello[world".split("\[")
e questo fa:
"hello[world".split("\\[")
Perché non funziona?Groovy: Perché devo raddoppiare le parentesi quadre?
"hello[world".split("\[")
e questo fa:
"hello[world".split("\\[")
Questo è in realtà due uscite in contesti diversi, a causa del fatto che l'argomento è un'espressione regolare come stringa.
L'[
deve essere preceduto da escape perché altrimenti avrebbe un significato speciale nell'espressione regolare. L'escape per l'espressione regolare lo renderebbe \[
. Ma il \
deve essere sottoposto a escape in quanto ha un significato speciale in una stringa (per l'escape e per rappresentare i caratteri in base al valore numerico).
Può essere molto peggio, poiché il carattere \
viene utilizzato per l'escape in entrambi i contesti. Se si desidera dividere il carattere \
, è necessario sfuggire a esso (\\
) per l'utilizzo di espressioni regolari, ma in questo caso si hanno due caratteri \
, che devono essere entrambi sottoposti a escape nel contesto stringa. L'utilizzo nella stringa originale siete scissione avrebbe bisogno anche la fuga se si sta scrivendo come una costante, in modo analogo la scissione sarà simile:
"hello\\world".split("\\\\")
Le varie versioni di Groovy dare risultati diversi.
Per Groovy 1,1-beta-1 e poi,
assert "hello[world".split("\\[") == ["hello", "world"]
afferma OK, ma Groovy 1.0 e prima dà un errore di asserzione.
assert "hello[world".split(/\[/) == ["hello", "world"]
afferma OK per tutte le versioni da 1,1-beta-1 in poi, Groovy 1.0-JSR-01 1.0 dà un errore di asserzione, mentre Groovy 1.0-beta-10 e prima dà un errore lessicale.
"hello[world".split("\\[").each{println it}
per tutte le versioni di Groovy da 1.0-beta-5, e beta-3, stampe
hello
world
ma 1.0-beta-4 stampe
[.]
[.]
hello
world
Accanto @Don Roby risposta , se usi una regex groovy puoi scorciatoiare i double escape usando la sintassi '/ \ [/'. – matcauthon