2010-09-21 7 views
27

Recientemente descubrí que no he estado usando expresiones regulares apropiadamente en mi código. Dado el ejemplo de una cadena delimitada por tabulaciones str, he estado usando str.split("\t"). Ahora me doy cuenta de que esto está mal y para hacer coincidir las pestañas correctamente, debo usar str.split("\\t").Comprensión de expresiones regulares en Java: división (" t") frente a división ("\ t") - cuándo funcionan ambas, y cuándo deben usarse

Sin embargo, me tropiezo con este hecho por pura casualidad, ya que estaba buscando patrones de expresiones regulares para otra cosa. Verá, el código defectuoso split("\t") ha funcionado bastante bien en mi caso, y ahora estoy confundido sobre por qué funciona si es la forma incorrecta de declarar una expresión regular para hacer coincidir el carácter de tabulación. De ahí la pregunta, por el bien de entender realmente cómo se maneja la expresión regular en Java, en lugar de simplemente copiar el código en Eclipse y no preocuparse realmente por qué funciona ...

De manera similar, he encontrado una pieza de texto que no solo está delimitado por tabuladores sino que también está delimitado por comas. Más claramente puesto, las listas delimitadas por tabuladores que estoy analizando a veces incluyen elementos "compuestos" que se parecen a: item1,item2,item3 y me gustaría analizarlos como elementos separados, en aras de la simplicidad. En ese caso, la expresión regular de expresiones regulares debería ser: line.split("[\\t,]"), ¿o me equivoco aquí también?

Gracias de antemano,

+0

Así que su lista es tanto pestaña y separados por comas, pero a veces las pestañas no son separadores? – Gumbo

+0

bien ... no. Es una lista de identificadores separados por tabuladores, sin embargo, entre los elementos hay algunos pares/trillizos de id.s separados por comas. Ver: http://www.pathwaycommons.org/pc/webservice.do?version=2.0&cmd=get_record_by_cpath_id&q=767212&output=gsea&output_id_type=UNIPROT – posdef

+0

Esta pregunta y sus respuestas también están relacionadas y son útiles. Compruébelo [https://stackoverflow.com/questions/1635764/string-parsing-in-java-with-delimeter-tab-t-using-split](aquí) – Bouramas

Respuesta

37

Al utilizar "\t", la escape sequence\t se sustituye por Java con el carácter U + 0009. Cuando se usa "\\t", la secuencia de escape \\ en \\t se reemplaza por Java con \, lo que resulta en \t que luego es interpretado por el analizador regular expression como el carácter U + 0009.

Por lo tanto, ambas interpretaciones se interpretarán correctamente. Es solo la pregunta cuando se reemplaza con el personaje correspondiente.

+0

así que ¿por qué se considera "incorrecto" usarlo? 'split (" \ t ")' para analizar una cadena delimitada por tabuladores? – posdef

+0

@posdef ¿Lo es? \ t El carácter de tabulación ('\ u0009') es lo que la referencia de oráculo le dice para una lengüeta regex. Ver http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html#sum – InsertNickHere

+2

@InsertNickHere - en realidad, la referencia del oráculo te dice que uses un '\ t' en una cuerda. Si esta cadena está dada por un literal, debe doblar la barra diagonal inversa, consulte el párrafo siguiente: http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html #bs, pero la referencia también dice que puede usar 'x' para el carácter' x', por lo que NO es incorrecto usar "\ t" o "\ u0009" –

0

\ es considerar que escapar carbón en Java, por lo que para obtener la expresión regular correcta tiene que escapar \ con \ y T para indicar pestaña.

This tutorial te ayudará más

+0

Gracias por la respuesta, aunque creo que debería volver a leer la pregunta original ... Ya he indicado que había aprendido la forma correcta de obtener la expresión regular y el escape. Mi pregunta es por qué la expresión regular "incorrecta" aún funcionaba. Por cierto, publiqué la pregunta DESPUÉS de leer el tutorial ... – posdef

+1

Java tiene caracteres de escape para indicar algunos caracteres especiales, p. nueva línea, barra diagonal inversa, pestaña, etc. Entonces (\\ t == \ t) y (\ t = tab char). Pero no estoy seguro de cómo Regex internamente se ocupa de la pestaña. –

Cuestiones relacionadas