Blackthog 1 Denunciar post Postado Junho 13, 2015 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
_Isis_ 202 Denunciar post Postado Junho 14, 2015 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
Blackthog 1 Denunciar post Postado Junho 14, 2015 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
_Isis_ 202 Denunciar post Postado Junho 14, 2015 https://docs.oracle.com/javase/tutorial/essential/regex/ Compartilhar este post Link para o post Compartilhar em outros sites
Blackthog 1 Denunciar post Postado Junho 14, 2015 https://docs.oracle.com/javase/tutorial/essential/regex/ Olá novamente, Sim, eu pesquisei no Google, e encontrei este Link citado acima.. Mesmo por consequência disso continuo sem entender como fazer o que informei no tópico, deve ser algo para quem tem mais experiência em regex.. Compartilhar este post Link para o post Compartilhar em outros sites
reebr 94 Denunciar post Postado Junho 14, 2015 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
Blackthog 1 Denunciar post Postado Junho 14, 2015 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
reebr 94 Denunciar post Postado Junho 14, 2015 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
Blackthog 1 Denunciar post Postado Junho 14, 2015 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
reebr 94 Denunciar post Postado Junho 14, 2015 Mas dê uma procurada, é bem capaz que já exista alguma biblioteca pronta (e bem mais eficaz) para isso. Compartilhar este post Link para o post Compartilhar em outros sites
Blackthog 1 Denunciar post Postado Junho 14, 2015 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
reebr 94 Denunciar post Postado Junho 14, 2015 Qual o problema? O código vai quebrar a string pelos espaços em branco: foo b.a.r ([{baz}]) | | | 0 1 2 Compartilhar este post Link para o post Compartilhar em outros sites
Blackthog 1 Denunciar post Postado Junho 19, 2015 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