2012-02-27 16 views
16

Considere el siguiente fragmento de código:¿Cómo encontrar la palabra exacta usando una expresión regular en Java?

String input = "Print this"; 
System.out.println(input.matches("\\bthis\\b")); 

salida

false 

¿Qué podría ser posiblemente mal con este enfoque? Si es incorrecto, ¿cuál es la solución correcta para encontrar la coincidencia exacta de palabras?

PD: He encontrado una variedad de preguntas similares aquí, pero ninguna de ellas proporciona la solución que estoy buscando. Es un problema directo para el cual no he podido encontrar la solución adecuada.

Gracias de antemano.

Respuesta

25

Cuando utiliza el método matches(), intenta hacer coincidir toda la entrada. En su ejemplo, la entrada "Imprimir esto" no coincide con el patrón porque la palabra "Imprimir" no coincide.

Por lo tanto, debe agregar algo a la expresión regular para que coincida con la parte inicial de la cadena, p. Ej.

.*\\bthis\\b 

Y si desea permitir que el texto adicional al final de la línea demasiado:

.*\\bthis\\b.* 

Como alternativa, utilice un objeto Matcher y utilizar Matcher.find() para encontrar coincidencias dentro la cadena de entrada:

Pattern p = Pattern.compile("\\bthis\\b"); 
    Matcher m = p.matcher("Print this"); 
    m.find(); 
    System.out.println(m.group()); 

salida:

this 

Si desea encontrar varias coincidencias en una línea, puede llamar al find() y group() repetidamente para extraerlas todas.

4

Para una buena explicación, ver: http://www.regular-expressions.info/java.html

myString.matches ("expresiones regulares") devuelve verdadero o falso dependiendo de si la cadena puede ser igualada por completo por la expresión regular. Es importante recordar que String.matches() solo devuelve verdadero si la cadena completa puede coincidir. En otras palabras: "regex" se aplica como si hubiera escrito "^ regex $" con el inicio y el final de los anclajes de cadena. Este es diferente de la mayoría de las otras bibliotecas de expresiones regulares, donde el método "prueba rápida " devuelve verdadero si la expresión regular puede coincidir en cualquier lugar de la cadena . Si myString es abc, myString.matches ("bc") devuelve falso. bc coincide con abc, pero^bc $ (que realmente se usa aquí) no.

Esto escribe "verdadero":

String input = "Print this"; 
System.out.println(input.matches(".*\\bthis\\b")); 
2

Puede utilizar grupos para encontrar la palabra exacta. Regex API especifica grupos por paréntesis.Por ejemplo:

A(B(C))D

Esta declaración se compone de tres grupos, que están indexados de 0.

  • 0th grupo - ABCD
  • 1er grupo - BC
  • segundo grupo - C

Así que si necesita encontrar una palabra específica, puede usar dos métodos i n Matcher clase tales como: find() para encontrar instrucción especificada por expresiones regulares, y luego obtener un objeto String especificado por su número de grupo:

String statement = "Hello, my beautiful world"; 
Pattern pattern = Pattern.compile("Hello, my (\\w+).*"); 
Matcher m = pattern.matcher(statement); 
m.find(); 
System.out.println(m.group(1)); 

El resultado código será "hermosa"

+0

'find()' devuelve un valor booleano que indica si la coincidencia fue exitosa o no. Debería * nunca * llamar a 'find()' e ignorar el resultado. Lo mismo para 'matches()' y 'lookingAt()'. Además, los números de grupo están indexados de uno, no de cero. El primer "grupo", "grupo (0)", es uno artificial que representa la coincidencia completa. –

1

Está su searchString ir ser expresión regular? si no simplemente usar String.contains(CharSequence s)

+1

Tenga en cuenta que cuando pasa '' this "' al método 'contains', también devuelve true, si la cadena de entrada es' "isthisnice" 'sin espacios. Entonces no lo sabes, si el partido es la palabra exacta. –

8

ejemplo de método completo para matcher:

public static String REGEX_FIND_WORD="(?i).*?\\b%s\\b.*?"; 

public static boolean containsWord(String text, String word) { 
    String regex=String.format(REGEX_FIND_WORD, Pattern.quote(word)); 
    return text.matches(regex); 
} 

Explique: (? i)

  1. - ignorecase
  2. *.? - Permitir (optinally) ningún carácter antes
  3. \ b - límite de palabra
  4. % s - variable para ser cambiado por String.Format (citado para evitar errores de expresiones regulares )
  5. \ b - límite de palabras
  6. . *? - permitir (opcionalmente) cualquier carácter después de
+0

'. *' Ya tiene _cualquier carácter cero o más veces_ por lo que no necesita el '?'. –

0

System.out.println (input.matches (". * \\ bthis $"));

También funciona. Aquí el. * Coincide con cualquier cosa antes del espacio y luego se combina con la palabra al final.

Cuestiones relacionadas