Pregunta

Necesito hacer coincidir ciertas cosas de las líneas de un texto de entrada. Las líneas se ven así:

 to be/ Σ _ Σ  [1pos, 1neg] {0=1, 2=1}

Estoy usando la clase Scanner para leer cada línea del texto, y he escrito el siguiente código. Sin embargo, algo no funciona correctamente, porque el patrón "a" no coincide con la línea, y debería serlo, porque " a " está contenido en la línea (he intentado hacer coincidir no solo " a " desde la línea, sino que nada coincide):

 Scanner scanner = new Scanner(file);
 while(scanner.hasNext()) {
      String line = scanner.nextLine();
      System.out.println("line: " + line);
      Pattern p_pos = Pattern.compile("to");
      Matcher m_pos = p_pos.matcher(line);
      String match = m_pos.group(0);
      System.out.println("match: " + match);
      boolean b_pos = m_pos.matches();
      if(b_pos) {
          System.out.println(match);
      }
 }

Salida:

line:    to be/ Σ _ Σ  [1pos, 1neg] {0=1, 2=1}
Exception in thread "main" java.lang.IllegalStateException: No match found
    at java.util.regex.Matcher.group(Matcher.java:485)
    at lady.PhrasesFromFile.readFile(PhrasesFromFile.java:31)
    at lady.PhrasesFromFile.main(PhrasesFromFile.java:17)

Tengo una pregunta más: ¿cómo puedo procesar la línea para almacenar todo desde el principio de la línea hasta el primer " / " ¿símbolo? No pude encontrar ningún método para eso en la API. ¿Es posible hacerlo? Básicamente quiero ir consecutivamente a través de la línea, almacenar partes de la línea en diferentes variables y luego usar los valores de estas variables. Como no sé cuántas fichas tengo antes del primer " / '' símbolo, no puedo usar next () una cierta cantidad de veces.

Gracias de antemano.

¿Fue útil?

Solución

.matches () intenta hacer coincidir la cadena de entrada completa . Use .find () si desea hacer coincidir una parte de la cadena de entrada, o .lookingAt () si desea hacer coincidir el comienzo de la cadena de entrada.

http: // java .sun.com / j2se / 1.4.2 / docs / api / java / util / regex / Matcher.html

Además, si expande su patrón para incluir grupos coincidentes (consulte una referencia general de expresiones regulares para obtener más detalles sobre cómo funcionan los grupos coincidentes), puede usar la función .group () después de una coincidencia exitosa para recuperar la subcadena emparejada por un grupo particular dentro del patrón.

Otros consejos

Puede extraer la parte que necesita para los tokens usando:

String tokenSection = Pattern.compile("(to\\s+.*?)/").matcher(line).find().group(1);

y luego recorrerlo para extraer los tokens usando

Pattern.compile("\\w+").matcher(tokenSection).find();

Obviamente, no conectarías las piezas de código anteriores directamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top