2009-12-30 14 views
9

¿Cómo se establece el delimitador para un escáner a cualquiera; o nueva línea?Pregunta de Java Scanner

me trataron: Scanner.useDelimiter(Pattern.compile("(\n)|;")); Pero no funciona.

+0

Encontré el error, tengo que usar (\ r \ n) | ;. Estaba analizando algo como esto: cadena, número \ r \ n ... y no tomó algo como 100 \ r como un número. – Razvi

Respuesta

15

Como regla general, en los patrones, debe doblar el \.

lo tanto, tratar

Scanner.useDelimiter(Pattern.compile("(\\n)|;"));` 

o

Scanner.useDelimiter(Pattern.compile("[\\n;]"));` 

Edición: Si \r\n es el problema, es posible que desee probar esto:

Scanner.useDelimiter(Pattern.compile("[\\r\\n;]+")); 

que coincide uno o más de \r, \n y ;.

Nota: No he probado estos.

+1

Puede ir de cualquier manera. Si usa dos barras diagonales inversas, el compilador de expresiones regulares ve '\ n' y lo interpreta como la secuencia de escape para un salto de línea. Si utiliza una barra diagonal inversa, el compilador de expresiones regulares ve un carácter real de salto de línea, que coincide literalmente. Pero definitivamente iría con la versión de clase de personaje: '" [\\ n;] "' or '" [\ n;] "'; es más fácil de leer y más eficiente. –

+0

@ Alan Moore: Ah, vale ... Simplemente asumí que un salto de línea literal sería malinterpretado. – Powerlord

1

Mirando el comentario de OP, parece que fue una terminación de línea diferente (\ r \ n o CRLF) ese fue el problema.

Aquí es mi respuesta, lo que manejar múltiples puntos y comas y los finales de línea en cualquier formato (pueden o no desear)

Scanner.useDelimiter(Pattern.compile("([\n;]|(\r\n))+")); 

por ejemplo, un archivo de entrada que tiene este aspecto:

1 


2;3;;4 
5 

resultaría en 1,2,3,4,5

Probé normales \ ny \\ n - ambos trabajaron en mi caso, aunque estoy de acuerdo si necesita una barra diagonal inversa normal, querrá duplicarla, ya que es un carácter de escape. Lo que pasa es que en este caso, "\ n" se convierte en el carácter deseado con o sin el extra '\'

9

Como usted ha descubierto, lo necesario para buscar el estilo DOS/red \r\n (CRLF) separadores de línea en lugar del estilo Unix \n (solo LF). Pero, ¿y si el texto contiene ambos? Eso pasa mucho; de hecho, cuando veo el origen de esta página, veo ambas variedades.

Debe adquirir el hábito de buscar ambos tipos de separador, así como el estilo anterior de Mac \r (solo CR). He aquí una manera de hacer eso:

\r?\n|\r 

tapar que en su código de ejemplo que se obtiene:

scanner.useDelimiter(";|\r?\n|\r"); 

Esto es suponiendo que desea hacer coincidir exactamente un salto de línea o punto y coma en un momento.Si desea hacer coincidir uno o más se puede hacer esto en su lugar:

scanner.useDelimiter("[;\r\n]+"); 

Nota, también, cómo pasé en una expresión regular en lugar de un patrón; todas las expresiones regulares se almacenan en caché automáticamente, por lo que la precompresión de la expresión regular no le proporciona ninguna ganancia de rendimiento.