Buscar palabra escondida con regex

publicado por: Anonymous

Estoy tratando de buscar una palabra oculta con regex, pero no entiendo porqué mi código no funciona.

String s = "ahwereovnkejfnlvienfvia";
String regex = "[a-z]h[a-z]o[a-z]l[a-z]a[a-z]";
String regex2 = ".h.o.l.a."
Pattern p = Pattern.compile(regex);

Mi objetivo es saber si el string contiene oculta entre los caracteres la palabra “hola”, pero siempre me dice que no.

La lógica que estoy tratando de usar es:

  • cualquier caracter delante o detrás de los caracteres de la palabra que busco.
  • no sé conoce cuantos caracteres hay delante ni detrás de cada letra de la palabra oculta.

solución

La expresión regular que has definido no se adecua al problema que intentas resolver ya que:

  • permite la existencia de un único carácter antes de cada letra de la palabra "hola"
  • los caracteres entre palabras no son opcionales

Solo matchearia strings que cumplan dichas condiciones, como por ejemplo 1h2o3l4a5

Lo que necesitas es una expresión regular que permita que existan 0 o más caracteres entre las letras y eso lo puedes lograr con .*

.* es análogo a utilizar .{0,}, y representa cualquier caracter, 0 o más veces.

La expresión regular a utilizar sería:

.*h.*o.*l.*a.*

En Java puedes definir un método que reciba un string a chequear y una palabra oculta a encontrar y en base a esta ultima construir la expresión regular:

public static void main(String[] args) {
    System.out.println(findWord("h_o_l4a$#", "hola")); // true
    System.out.println(findWord("1$h#2o3#l4#a5", "hola")); // true
    System.out.println(findWord("1h2o3l4a5","hola")); // true
    System.out.println(findWord("ha2loa","hola")); // false
    
    System.out.println(findWord("#a$di0os", "adios")); // true
    System.out.println(findWord("ad?i0os1", "adios")); // true
    System.out.println(findWord("1ad1os?","adios")); // false

}

private static boolean findWord(String string, String hiddenWord){
      StringBuilder regex= new StringBuilder(".*");
      for (char c: hiddenWord.toCharArray()) {
            regex.append(c);
            regex.append(".*");
      }
      Pattern p = Pattern.compile(regex.toString());
      Matcher m = p.matcher(string);
      return m.matches();
}

    
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *