2009-09-26 57 views
34

Por lo que entiendo, el punto de barra invertida (\.) significa un carácter de cualquier personaje? Entonces, como la barra diagonal inversa es un escape, debe ser barra invertida barra invertida ("\\.")Expresión regular de Java value.split ("\."), "El punto de barra invertida" se divide por carácter?

¿Qué le hace esto a una cadena? Acabo de ver esto en un código existente en el que estoy trabajando. Por lo que entiendo, dividirá la cadena en caracteres individuales. ¿Por qué hacer esto en vez de String.toCharArray()? Entonces, ¿esto divide la cadena en una matriz de cadena que contiene solo un carácter para cada cadena en la matriz?

Respuesta

68

Supongo que le falta la barra invertida ('\') los caracteres son caracteres de escape en los literales de Java String. Entonces, cuando quiera usar un escape '\' en una expresión regular escrita como Java String, necesita escapar de ella; p.ej.

Pattern.compile("\."); // Java syntax error 

// A regex that matches a (any) character 
Pattern.compile("."); 

// A regex that matches a literal '.' character 
Pattern.compile("\\."); 

// A regex that matches a literal '\' followed by one character 
Pattern.compile("\\\\."); 

El método String.split(String separatorRegex) divide una cadena en subcadenas separadas por subcadenas que coinciden con la expresión regular. Entonces str.split("\\.") dividirá str en subcadenas separadas por un solo literal '.' personaje.

+0

:: ¡Funciona bien! Pero ¿podrías elaborar más sobre esto, como por qué cuatro barras invertidas? ¿No debería haber tres? – Oliver

+2

Una barra diagonal inversa literal debe escaparse una vez en una expresión regular. Eso da 2. Esas 2 barras diagonales inversas deben escaparse en un literal String. Eso hace 4. Tres barras invertidas le darán un error de compilación de Java. Pruébalo y compruébalo por ti mismo. –

+0

¿Por qué Pattern.compile ("\."); producir un error de sintaxis? – adub3

7

La expresión regular "." emparejaría cualquier carácter como usted declara. Sin embargo, un punto escapado "\" coincidiría con los caracteres de puntos literales. Por lo tanto, 192.168.1.1 se divide en "\". daría como resultado {"192", "168", "1", "1"}.

Su redacción no está del todo clara, pero creo que esto es lo que está preguntando.

Cuestiones relacionadas