Para peritos em manipulação de String [Resolvido]

gostaria de separa os numeros dos sinais matemáticos ex:

quanto é 2+2

fica

quanto é 2 + 2

alguem pode me ajudar com um código prático para isso?

Talvez as classes Pattern e Matcher possam te ajudar.
Crie uma expressão regular capaz de reconhecer uma sequencia de sinal matemático (+,-,*,etc) e número, ou uma sequencia de número e sinal matemático.
Utilize métodos dessas duas classes para encontrar as posições em que tais expressões são reconhecidas, e adicione o espaço oportunamente.

realmente eu já estudei sobre isso. é que não tenho a maturidade de conhecimento para criar algo assim… rs rs rs
se puder me ajudar com o código agradeço :slight_smile:

Veja este pequeno exemplo:

public class Main { static String fonte = "2+2"; public static void main(String[] args) { Pattern pattern= Pattern.compile("((\\+\\d)|(\\d\\+))"); Matcher matcher = pattern.matcher("2+2"); while (matcher.find()){ StringBuilder aux = new StringBuilder(fonte); aux.insert(matcher.start() + 1, " "); fonte = aux.toString(); } System.out.println (fonte); } }

Neste caso criei uma expressão regular que reconhece a sequencia de um sinal de + seguido por um digito, ou então um digito seguido por um sinal de mais. Você pode facilmente estender para que a expressão reconheça todos os simbolos que necessita.
Este exemplo tem um pequeno problema:
O método find encontra o primeiro match em 2+. Adiciona um espaço logo depois do sinal +. E termina. Ele não encontra o match +2 pois o caractere + ja foi usado no primeiro match, então ele não é mais considerado. A inserção do espaço também está provavelmente equivocada. Pode ser que seja interessante você inserir o espaço antes do match…e não depois… Mas minha intenção foi te dar uma ideia de como usar essas classes.
Tenta dar uma mexida nisso e veja se te serve. Até.

Tenta isso, q resolve…

System.out.println("2+2".replaceAll("(\\d+) *([*/+-]) *(\\d+)", "$1 $2 $3"));

só q vc vai precisar ajustar o padrão p/ contas mais complexas…

[quote=barenko]Tenta isso, q resolve…

System.out.println("2+2".replaceAll("(\\d+) *([*/+-]) *(\\d+)", "$1 $2 $3"));

só q vc vai precisar ajustar o padrão p/ contas mais complexas…[/quote]

Resolve casos básicos. Onde se sabe de antemão o número de parâmetros. Já não resolve, por exemplo, "“2+2+2”. E se forem n números separados por n-1 simbolos? Como é que fica a parte “$1 $2 $3” ?

[quote=rod.attack]
Resolve casos básicos. Onde se sabe de antemão o número de parâmetros. Já não resolve, por exemplo, "“2+2+2”. E se forem n números separados por n-1 simbolos? Como é que fica a parte “$1 $2 $3” ?[/quote]

ok, então, basta usar isso:

System.out.println("2+2+45".replaceAll(" *([+-/*]) *", " $1 "));

[quote=barenko][quote=rod.attack]
Resolve casos básicos. Onde se sabe de antemão o número de parâmetros. Já não resolve, por exemplo, "“2+2+2”. E se forem n números separados por n-1 simbolos? Como é que fica a parte “$1 $2 $3” ?[/quote]

ok, então, basta usar isso:

System.out.println("2+2+45".replaceAll(" *([+-/*]) *", " $1 "));

Legal. Esse primeiro * está funcionando como exatamente? Não peguei bem a ideia dessa ER.

Legal pessoal. Show de bola.

[quote=rod.attack]
Legal. Esse primeiro * está funcionando como exatamente? Não peguei bem a ideia dessa ER.[/quote]

é para ignorar N espaços em branco antes do sinal… funciona igual ao terceiro *.

os exemplos acima são excelentes, mas vou explicar melhor: estou trabalhando com processamento de linguagem natural, um robo virtual que processa perguntas, porém ele processa token por token sendo assim isto é um toke só “2+2” e isto são três tokens “2 + 2”. Oks.
Valew galera.