Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Blackthog

Identificar uma ordem em uma String e caputar os elementos da mesma

Recommended Posts

Olá,

 

Estou criando uma extensão de um outro sistema que não vem ao caso aqui, e pra isso, preciso dar um jeito de "interpretar" uma String (a original) e capiturar apenas oque eu quero que está em uma posição do contexto dela.

 


Observem este exemplo:

 

A mensagem original NESTE CASO seria esta: "Olá, meu nome é Lincoln e eu tenho 23 dólares."

 

A pessoa vai descrever na configuração YAML a mensagem que é para ser editada, de forma que mostre que os argumententos não são fixos:

Sistema:
  Mensagem1:
    Original: "Olá, meu nome é {X} e eu tenho {Y} dólares."
    Transformar: "Eu tenho {Y} dólares."


 

Como a mensagem que viria a acontecer seria "Olá, meu nome é Lincoln e eu tenho 23 dólares.", o {X} retornaria "Lincoln" e o {Y} retornaria "23", interpretando a String original e capturando apenas oque eu quero (representado pelos {}), retornando os valores no Java, para então eu poder transformar a mensagem mas podendo manter os valores originais que eu quiser. (Vale lembrar que nem sempre será "Olá, meu nome é..", poderá ser qualquer mensagem com quantos valores ({X}, {A}, etc..) quiser).

 

Preciso entender uma lógica para interpretar a String e capiturar esses {X}, {Y}. etc.. para poder trabalhar com os valores e transformar a String, e gostaria de ajuda nisso.

 

Tenho muita urgência, e agradeço antecipadamente por alguém possa me ajudar ou até mesmo me dar uma mínima dica básica.

 

Atenciosamente,

Blackthog - Pitter Thog - blackthog@outlook.com

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ela precisa realmente escrever dessa forma ({Y})? Não pode ser com expressões regulares? Ou você consegue ao menos prever e separar os casos p/ utilizar regex?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ela precisa realmente escrever dessa forma ({Y})? Não pode ser com expressões regulares? Ou você consegue ao menos prever e separar os casos p/ utilizar regex?

 

Pode ser de qualquer forma que "destaque" (pro sistema entender) que é naquela posição (ou naquelas posições) que deve ser pego o(s) valor(es)..

 

Sou novato no Regex/Pattern ainda, to procurando dar uma estudada para entender melhor.. se poder me ajudar, agradeço muito mesmo.

 

Att.,

Blackthog - Pitter Thog - blackthog@outlook.com

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você quer obter o valor entre { } ou substituir o que estiver entre chaves por um valor específico?

 

A mensagem vai ser "Olá, meu nome é Fulano e eu tenho 2.00 dólares." ou "Olá, meu nome é {Fulano} e eu tenho {2.00} dólares." ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você quer obter o valor entre { } ou substituir o que estiver entre chaves por um valor específico?

 

A mensagem vai ser "Olá, meu nome é Fulano e eu tenho 2.00 dólares." ou "Olá, meu nome é {Fulano} e eu tenho {2.00} dólares." ?

 

Nenhuma das ambas opções..

 

É um sistema que vai mudar certos textos, como expliquei no tópico, no entanto, mantendo os valores que nele tem que a pessoa que configurar desejar.

 

EXEMPLO:

 

Supondo que o texto é "Sou Lincoln".

 

Segue a configuração:

Sistema:
  Mensagem1:
    Original: "Sou {X}"
    EditarPara: "Meu nome é {X}"

Esse {X} poderá vir a ser qualquer coisa que não sabemos o que será, mas que precisamos manipular.

 

O Java vai interpretar a mensagem original de acordo com o padrão na "Mensagem1 -> Original", e interpretando, vai ver a sequência do texto, e pegar do "Sou Lincoln" o {X}, que na sequência ali retorna "Lincoln".

 

Então ele vai mudar a mensagem (ali no "EditarPara") para "Meu nome é Lincoln", substituindo o {X} por Lincoln (capturado anteriormente na "Original")

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, uma sugestão é quebrar a string em várias (pelo espaçamento em branco) e recuperar o valor em um determinado índice. Então você pode definir no arquivo qual índice será modificado. Exemplo:

Olá, meu nome é Fulano e eu tenho 2.00 dólares.
 |    |   |   |    |   |  |   |     |     |
 0    1   2   3    4   5  6   7     8     9

Um exemplo que fiz aqui (Java8):

public List<String> get(String message, int...indexes){
        
    List<Integer> indexez = IntStream.of(indexes).boxed().collect(Collectors.toList());
    String[] words = message.split("\\s+");
        
    List<String> ret = new ArrayList<>();
    for(int i = 0; i < words.length; i++)
       if(indexez.contains(i))
           ret.add(words[i]);
    return ret;
}

Supondo que você precise obter o valor do índice 4:

String foo = get("Olá, meu nome é Fulano e eu tenho 2.00 dólares.", 4).get(0);
System.out.println(foo); // Fulano

No caso dos índices 4 e 8:

System.out.println(get("Olá, meu nome é Fulano e eu tenho 2.00 dólares.", 4, 8));
// [Fulano, 2.00]

É a melhor forma? Não sei, mas foi a que pensei aqui de momento.

Se tiver uma forma de fazer isso com regex ou já existir uma biblioteca pronta para isso, talvez seja mais elegante.

 

Já para substituir os valores em uma string é mais simples. Você pode usar o método MessageFormat#format(), a diferença é que ao invés de {x} e {y} você teria que usar {0}, {1}...

// Método anterior, pegando o índice [1] = Fulano.
String nome = get("Sou Fulano", 1).get(0); 

String mensagemFormatada = MessageFormat.format("Meu nome é {0}", nome);
System.out.println(mensagemFormatada); // Meu nome é Fulano

EXEMPLO ONLINE

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, uma sugestão é quebrar a string em várias (pelo espaçamento em branco) e recuperar o valor em um determinado índice. Então você pode definir no arquivo qual índice será modificado. Exemplo:

Olá, meu nome é Fulano e eu tenho 2.00 dólares.
 |    |   |   |    |   |  |   |     |     |
 0    1   2   3    4   5  6   7     8     9

Um exemplo que fiz aqui (Java8):

public List<String> get(String message, int...indexes){
        
    List<Integer> indexez = IntStream.of(indexes).boxed().collect(Collectors.toList());
    String[] words = message.split("\\s+");
        
    List<String> ret = new ArrayList<>();
    for(int i = 0; i < words.length; i++)
       if(indexez.contains(i))
           ret.add(words[i]);
    return ret;
}

Supondo que você precise obter o valor do índice 4:

String foo = get("Olá, meu nome é Fulano e eu tenho 2.00 dólares.", 4).get(0);
System.out.println(foo); // Fulano

No caso dos índices 4 e 8:

System.out.println(get("Olá, meu nome é Fulano e eu tenho 2.00 dólares.", 4, 8));
// [Fulano, 2.00]

É a melhor forma? Não sei, mas foi a que pensei aqui de momento.

Se tiver uma forma de fazer isso com regex ou já existir uma biblioteca pronta para isso, talvez seja mais elegante.

 

Já para substituir os valores em uma string é mais simples. Você pode usar o método MessageFormat#format(), a diferença é que ao invés de {x} e {y} você teria que usar {0}, {1}...

// Método anterior, pegando o índice [1] = Fulano.
String nome = get("Sou Fulano", 1).get(0); 

String mensagemFormatada = MessageFormat.format("Meu nome é {0}", nome);
System.out.println(mensagemFormatada); // Meu nome é Fulano

EXEMPLO ONLINE

 

Sem palavras pelo seu suporte.. mesmo!

Obrigado, isso foi de grande ajuda e será de muita e total utilidade para continuidade do sistema!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas dê uma procurada, é bem capaz que já exista alguma biblioteca pronta (e bem mais eficaz) para isso.

 

Cara, acabei de me lembrar de uma coisa... Podem conter valores com ponto, virgula, parenteses e etc no elemento a ser capturado..

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Qual o problema? O código vai quebrar a string pelos espaços em branco:

foo    b.a.r   ([{baz}])
  |      |         |
  0      1         2

 

E se por exemplo eu quisesse capturar isto:

 

Original: "1. Lincoln - Mora no Brasil"

Capturar: "{x}. {y} - Mora no {z}"?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.