Expressão regular

4 respostas
fenrir

Tenho estas 3 String:

  • Um exército portando o estandarte do Feiticeiro Cego sob o comando do(a) Veterano Leärdinoth está Aqui.
  • Uma esquadra portando o estandarte dos Corsários sob o comando do(a) Veterano Teldurmeir está Aqui.
  • Um vasto exército portando o estandarte dos Corsários sob o comando do(a) Lorde Angamaitë está Aqui.

As Strings são bem parecidas, e eu quero pegar delas duas informações: a nação (no caso, Feiticeiro Cego e Corsários) e o nome do personagem (Veterano Leärdinoth, Veterano Teldurmeir, etc.).

Há alguma forma de, através de expressões regulares, eu conseguir pegar essas informações? Ou através de qualquer outra forma mais “automatizada” do que um monte de if’s?

4 Respostas

louds

Um regexp +/- assim não funcionaria:

Um exército portando o estandarte dos? [ w]* sob o comando do(a) [ w]* está Aqui.

?

fenrir

O meu maior problema não é exatamente validar a String, mas sim pegar as informações dela, sem que EU precise fazer um parse nela.

Pensei em usar expressões regulares porque isso terá que funcionar para outros idiomas também. Mas não sei se efetivamente isso é possível… :frowning:

dukejeffrie

Expressoes regulares servem quando seu texto é regular.

Você tem que saber o que é fixo no seu texto. A partir das 3 strings acima, o que é fixo é o seguinte:

(.*) portando o estandarte dos? (.*) sob o comando do(a) (.*) está Aqui.

Pelo jeito que vc escreveu, Aqui também me parece uma variável.

Talvez seja mais interessante vc atacar do outro lado, o que produz a String. Se vc pode mexer do lado de lá, é bem mais fácil produzir uma lista de strings em vez de uma string só. Mesmo porque, dependendo da língua, suas palavras podem não estar na mesma ordem.

Se você tiver um pouco de paciência, pode no entanto desenvolver algo mais robusto usando classes do pacote java.text, MessageFormat e ChoiceFormat. Dá bastante trabalho, mas vc pode mexer com Locales com facilidade e mexer com a mensagem nas duas direções (parsing e formatting).

boa sorte!!
[]s

fenrir

Eu não tenho como mexer na criação da String, pois ela é retirada de um PDF! :slight_smile:

Ou seja, não tenho acesso à fonte, apenas tenho o “produto final”.
Mas eu consegui fazer o que queria. Este código retorna exatamente o que eu preciso:

Pattern p = Pattern.compile("Um.*estandarte d[eoas]{1,2} (.*) sob o comando do\(a\) (.*) está [aA]qui");
Matcher m = p.matcher(dado);
if (m.find()) {
    for (int i = 1; i <= m.groupCount(); i ++) {
        System.out.println("  " + m.group(i));
    }
}
Criado 23 de junho de 2003
Ultima resposta 24 de jun. de 2003
Respostas 4
Participantes 3