2011-07-05 43 views

Respuesta

86

En la mayoría de las implementaciones de expresiones regulares (incluidas las de Java), : no tiene ningún significado especial, ni dentro ni fuera de una clase de caracteres.

Su problema es muy probablemente debido al hecho de las - actúa como un operador de rango en su clase:

[A-Za-z0-9.,-:]* 

donde ,-: coincidencias entre todos los caracteres ASCII y ','':'. Sin embargo, ¡tenga en cuenta que aún coincide con el literal ':'!

Tal vez puedas probar:

[A-Za-z0-9.,:-]* 

Al colocar - al principio o al final de la clase, que coincide con el literal "-". Como se mencionó en los comentarios de Keoki Zee, también puede escapar del - dentro de la clase, pero la mayoría de la gente simplemente lo agrega al final.

Una demostración:

public class Test { 
    public static void main(String[] args) { 
     System.out.println("8:".matches("[,-:]+"));  // true: '8' is in the range ','..':' 
     System.out.println("8:".matches("[,:-]+"));  // false: '8' does not match ',' or ':' or '-' 
     System.out.println(",,-,:,:".matches("[,:-]+")); // true: all chars match ',' or ':' or '-' 
    } 
} 
+2

También puede escapar del guión con una barra invertida, '[a \ -z]'. –

+1

@Keoki: cierto, aunque me parece más claro hacer tan poco escapado (escapes dobles dentro de los literales de cadenas de Java) como sea posible. Aún así, es bueno mencionar que uno también puede escapar. –

+3

Colocar el guión al final es probablemente lo que hizo el programador anterior, lo que condujo a este error. Yo * siempre * escapo: termine el ciclo ':)' – Kobi

4

Colón no tiene significado especial en una clase de personaje y no necesita ser escapado. De acuerdo con the PHP regex docs, los únicos personajes que necesitan ser escapados en una clase de caracteres son los siguientes:

Todos los caracteres no alfanuméricos otra que \, -, ^ (al comienzo) y la de terminación ] son no especial en las clases de caracteres , pero no hace daño si se escapan.

Para obtener más información sobre las expresiones regulares de Java, consulte the docs.

+0

No entiendo por qué esto tiene un voto negativo, ¿alguien me puede explicar lo que podría estar mal con esta respuesta, por favor? –

+2

No voté a favor, ¿pero quizás porque vincula la documentación de expresiones regulares de PHP en una pregunta de expresiones regulares de Java? – hcpl

1

use \\: en lugar de \: .. el \ tiene un significado especial en java strings.

+2

Si bien es cierto que la barra diagonal inversa es un carácter de escape en cadenas de Java, escapar de la barra invertida aquí no resolverá el problema, ya que ':' no es una char especial en la expresión regular de todos modos. –

7

tener cuidado, - tiene un significado especial con expresiones regulares. En un [], puede ponerlo sin problema si se coloca al final. En su caso, ,-: se toma como de , a :.

Cuestiones relacionadas