Domanda

Devo abbinare determinate cose dalle righe di un testo di input. Le linee sono così:

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

Sto usando la classe Scanner per leggere ogni riga del testo e ho scritto il seguente codice. Tuttavia, qualcosa non funziona correttamente, poiché lo scalpiccio " a " non è confrontato con la linea e dovrebbe essere, poiché "quot" a " è contenuto nella riga (ho cercato di far corrispondere non solo " a " dalla riga, ma nulla corrisponde):

 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);
      }
 }

Output:

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)

Ho un'altra domanda: come posso elaborare la linea in modo da memorizzare tutto dall'inizio della linea fino alla prima "quot / /"; simbolo? Non sono riuscito a trovare alcun metodo per quello nell'API. È possibile farlo? Fondamentalmente voglio passare consecutivamente attraverso la linea, memorizzare i pezzi della linea in diverse variabili e quindi utilizzare i valori di queste variabili. Dal momento che non so quanti token ho prima del primo " / " simbolo, non posso usare next () un certo numero di volte.

Grazie in anticipo.

È stato utile?

Soluzione

.matches () tenta di far corrispondere la stringa di input intera . Utilizzare .find () se si desidera abbinare una parte della stringa di input o .lookingAt () se si desidera abbinare l'inizio della stringa di input.

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

Inoltre, se si espande il proprio modello per includere gruppi corrispondenti (vedere un riferimento generale regex per maggiori dettagli sul funzionamento dei gruppi corrispondenti), è possibile utilizzare la funzione .group () dopo una corrispondenza corretta per recuperare la sottostringa corrispondente a un determinato gruppo all'interno del modello.

Altri suggerimenti

È possibile estrarre la parte necessaria per i token utilizzando:

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

e quindi scorrere su quello per estrarre i token usando

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

Ovviamente, non inseriresti i pezzi di codice sopra.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top