Problema com correspondentes token em uma linha, usando Scanner em Java
-
22-07-2019 - |
Pergunta
Eu preciso coincidir com certas coisas de linhas de um texto de entrada. As linhas parecido com este:
to be/ Σ _ Σ [1pos, 1neg] {0=1, 2=1}
Eu estou usando a classe Scanner para ler cada linha do texto, e eu escrevi o seguinte código. No entanto, algo não está funcionando corretamente, porque o padrão de "para" não é comparado com a linha, e deve ser, porque "a" está contido na linha (eu tentei corresponder não só "para" a partir da linha, mas partidas nada):
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)
Eu tenho mais uma pergunta: como posso processar a linha para que eu armazenar tudo, desde o início da linha até o primeiro símbolo "/"? Eu não poderia encontrar qualquer método para que no API. É possível fazê-lo? Basicamente, eu quero consecutivamente para atravessar a linha, loja de peças da linha em diferentes variáveis, e, em seguida, usar os valores destas variáveis. Desde que eu não sei quantos símbolo tenho antes do primeiro símbolo "/", eu não posso usar next () um certo número de vezes.
Agradecemos antecipadamente.
Solução
tentativas .matches()
para coincidir com o inteira string de entrada. Use .find()
se você quer combinar uma parte da cadeia de entrada, ou .lookingAt()
se você quiser combinar com o começo da seqüência de entrada.
http: // java .sun.com / J2SE / 1.4.2 / docs / api / java / util / regex / Matcher.html
Além disso, se você expandir o seu padrão para incluir grupos correspondentes (ver referência regex geral para obter mais detalhes sobre os grupos como correspondência de trabalho), você pode usar a função .group()
após uma partida bem sucedida para recuperar o substring combinada por um grupo específico dentro o padrão.
Outras dicas
Você poderia extrair a parte que você precisa para os tokens usando:
String tokenSection = Pattern.compile("(to\\s+.*?)/").matcher(line).find().group(1);
e, em seguida, looping em cima disso para extrair os tokens usando
Pattern.compile("\\w+").matcher(tokenSection).find();
Obviamente, você não iria ligar as peças acima de certo código.