¿Por qué esto no funciona?Groovy: ¿Por qué tengo que escapar dos veces de los corchetes?
"hello[world".split("\[")
y esto hace:
"hello[world".split("\\[")
¿Por qué esto no funciona?Groovy: ¿Por qué tengo que escapar dos veces de los corchetes?
"hello[world".split("\[")
y esto hace:
"hello[world".split("\\[")
Esto es en realidad dos escapes en diferentes contextos, debido al hecho de que el argumento es una expresión regular representada como una cadena.
El [
tiene que ser escapado porque de lo contrario tendría un significado especial en la expresión regular. El escape para la expresión regular lo haría \[
. Pero entonces el \
tiene que ser escapado ya que tiene un significado especial en una cadena (para escaparse y para representar caracteres por valor numérico).
Puede ser mucho peor, ya que el carácter \
se usa para escapar en ambos contextos. Si desea dividir por el carácter \
, debe escapar (\\
) para el uso de expresiones regulares, pero luego tiene dos caracteres \
, que deben escaparse en contexto de cadena. El uso de la cadena original va a dividir también necesitaría la fuga si usted está escribiendo como una constante, por lo que la división análoga se vería así:
"hello\\world".split("\\\\")
Las diferentes versiones del maravilloso dar resultados diferentes.
Para Groovy 1,1-beta-1 y en adelante,
assert "hello[world".split("\\[") == ["hello", "world"]
afirma OK, pero Groovy 1.0 y antes da un error afirmación.
assert "hello[world".split(/\[/) == ["hello", "world"]
afirma OK para todas las versiones de 1,1-beta-1 en adelante, maravilloso 1,0-JSR-01 a 1,0 da un error afirmación, mientras Groovy 1,0-beta-10 y antes da un error de léxico.
"hello[world".split("\\[").each{println it}
para todas las versiones de Groovy de 1,0-beta-5, y beta-3, grabados
hello
world
pero 1,0-beta-4 grabados
[.]
[.]
hello
world
Junto respuesta @Don Roby , si usa una expresión regular groovy, puede atajar el doble escape usando la sintaxis '/ \ [/'. – matcauthon