Problema con il token corrispondente in una riga, utilizzando Scanner in Java
-
22-07-2019 - |
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.
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.