2011-10-23 9 views
17
import java.util.regex.Pattern; 

class HowEasy { 
    public boolean matches(String regex) { 
     System.out.println(Pattern.matches(regex, "abcABC ")); 
     return Pattern.matches(regex, "abcABC"); 
    } 

    public static void main(String[] args) { 
     HowEasy words = new HowEasy(); 
     words.matches("[a-zA-Z]"); 
    } 
} 

La salida es False. ¿Dónde estoy equivocado? También quiero verificar si una palabra contiene solo letras y puede o no puede terminar con un solo período. ¿Cuál es la expresión regular para eso?¿Cómo hacer coincidir letras solo con java regex, método de coincidencias?

i.e "abc" "abc." es válido pero "abc .." no es válido.

Puedo usar el método indexOf() para resolverlo, pero quiero saber si es posible usar una sola expresión regular.

Respuesta

33

"[a-zA-Z]" solo coincide con un caracter. Para hacer coincidir varios caracteres, use "[a-zA-Z]+".

Desde un punto es un comodín para cualquier carácter, que tiene que enmascararlo: "abc\." Para hacer el punto opcional, necesita un signo de interrogación: "abc\.?"

Si se escribe el patrón tan constante literal en su código , usted tiene que enmascarar la barra invertida:

System.out.println ("abc".matches ("abc\\.?")); 
System.out.println ("abc.".matches ("abc\\.?")); 
System.out.println ("abc..".matches ("abc\\.?")); 

la combinación de ambos patrones:

System.out.println ("abc.".matches ("[a-zA-Z]+\\.?")); 

lugar o f a-zA-Z, \ w es a menudo más adecuado, ya que captura caracteres extranjeros como äöüßø y así sucesivamente:

System.out.println ("abc.".matches ("\\w+\\.?")); 
+0

Usted tiene razón sobre [a-zA-Z] + ahora coincide sólo con letras. En realidad, la segunda expresión debería ser "abc \\.?" (en eclipse) –

+0

'en eclipse' no es el punto. Puede ingresar un patrón desde un archivo, desde la línea de comandos, desde un JTextField, opuesto a una constante literal en el código fuente, eso hace la diferencia. Lo mencioné mientras editaba ('mask the backslash'). Gracias de todos modos. –

+2

Tenga en cuenta que '\ w' captura también guiones bajos y números, es decir,' [a-zA-Z_0-9] 'como se define en [Patrón] (https://docs.oracle.com/javase/7/docs/api /java/util/regex/Pattern.html) – reallynice

0

matches método realiza la concordancia de la línea completa, es decir, es equivalente a find() con '^ abc ps Entonces, simplemente use Pattern.compile("[a-zA-Z]").matcher(str).find() en su lugar. Luego arregla tu expresión regular. Como @user unknown mencionó su expresión regular en realidad solo coincide con un personaje. Probablemente debería decir [a-zA-Z]+

5

[A-Za-z ]* para que coincida con letras y espacios.

0

tres problemas aquí:

  1. Sólo tiene que utilizar String.matches() - si la API está allí, lo utilizan
  2. en Java "partidos" significa "coincide con la totalidad de entrada", que en mi humilde opinión es contrario a la intuición , así que vamos a la API de su método refleja que al permitir que las personas que llaman piensan sobre la correspondencia de parte de la entrada como su ejemplo sugiere
  3. las coincidencias de expresiones regulares sólo el 1 carácter

le recomiendo que utilice un código como éste:

public boolean matches(String regex) { 
    regex = "^.*" + regex + ".*$"; // pad with regex to allow partial matching 
    System.out.println("abcABC ".matches(regex)); 
    return "abcABC ".matches(regex); 
} 

public static void main(String[] args) { 
    HowEasy words = new HowEasy(); 
    words.matches("[a-zA-Z]+"); // added "+" (ie 1-to-n of) to character class 
} 
Cuestiones relacionadas