2011-03-31 30 views
17

Este es mi código para determinar si una palabra contiene caracteres no alfanuméricos:Java expresiones regulares: comprobar si la palabra tiene caracteres alfanuméricos no

String term = "Hello-World"; 
    boolean found = false; 
    Pattern p = Pattern.Compile("\\W*"); 
    Matcher m = p.Matcher(term); 
    if(matcher.find()) 
    found = true; 

Me pregunto si la expresión de expresiones regulares es erróneo. Sé que "\W" coincidiría con cualquier carácter no verbal. ¿Alguna idea sobre lo que me estoy perdiendo?

Respuesta

16

cambio su expresión regular para:

.*\\W+.* 
4

Ésta es la expresion que busca:

"^ [a-zA-Z0-9] + $"

Cuando se evalúa como falso, significa que no concuerda, eso significa que encontraste lo que querías.

+1

No se olvide _... alpha_numeric ' "^ [a-zA-Z0-9] + $"' – vbence

+0

que no coincide con los valores numéricos! –

+0

Disculpe mi inglés, quizás no monté correctamente, pero si quiere alfa numérico, la mejor manera sería como dijo vbence. Acabo de actualizar la respuesta. – sfrj

0

Cuando tuve que hacer lo mismo, la expresión regular que uso es "(\ w) *" Eso es lo que uso. No estoy seguro si capitol w es lo mismo pero también utilicé paréntesis.

+0

Son diferentes. '\ W' (letra mayúscula) es el inverso de' \ w' - coincidirá con cualquier carácter que no coincida con la clase de caracteres '\ w'. – eldarerathis

2

El problema es el '*'. '*' coincide con CERO o más caracteres. Desea hacer coincidir al menos un carácter que no sea palabra, por lo que debe usar '+' como modificador de cantidad. Por lo tanto, coincide \W+ (Capital W existe para NON palabra)

3

Los métodos están en el caso equivocado.

El emparejador se declaró como m pero se usó como matcher.

La repetición debe ser "una o varias" + en lugar de "cero o muchos" * Esto funciona correctamente:

String term = "Hello-World"; 
boolean found = false; 
Pattern p = Pattern.compile("\\W+");//<-- compile(not Compile(
Matcher m = p.matcher(term); //<-- matcher(not Matcher 
if(m.find()) { //<-- m not matcher 
    found = true; 
} 

Por cierto, sería suficiente si sólo:

boolean found = m.find(); 

:)

1

Su expresión no tiene en cuenta posibles letras que no sean en inglés. También es más complicado de lo que necesita ser. A menos que utilice regexs por alguna razón que no sea necesario (como su profesor que haber dicho) que son mucho mejor con:

boolean found = false; 
for (int i=0;i<mystring.length();++i) { 
    if (!Character.isLetterOrDigit(mystring.charAt(i))) { 
    found=true; 
    break; 
    } 
} 
+0

¿es posible que el método isLetterOrDigit() reconozca caracteres chinos, rusos, japoneses, indios ...? No creo que pueda – sfrj

+1

@sfrj en realidad puede – jlarson

+0

@joe larson Genial, no sabía – sfrj

4

Es 2016 o posterior y se debe pensar acerca de las cadenas internacionales de otros alfabetos que solo latino. El [^a-zA-Z] frecuentemente citado no coincidirá en ese caso. Hay mejores maneras de Java ahora:

[^\\p{IsAlphabetic}^\\p{IsDigit}] 

Ver the reference (sección "Clases para los scripts Unicode, bloques, categorías y propiedades binarias"). También hay this answer que encontré útil.

-1
if (value.matches(".*[^a-zA-Z0-9].*")) { // tested, seems to work. 
    System.out.println("match"); 
} else { 
    System.out.println("no match"); 
} 
Cuestiones relacionadas