вставка в определенные части строки - PullRequest
1 голос
/ 10 января 2012

Я хотел бы вставить пробелы в определенных частях моей строки. Я пишу программу для калькулятора.

Например, для строки

"23+45" Я хочу, чтобы это было "23 + 45".

или "1+(4*8)" как "1 + ( 4 * 8 )".

Я делаю это, чтобы разделить строку в соответствии с пробелами,

Я использую алгоритм Shunting Yard, поэтому мне нужно токенизировать ввод.

Ответы [ 3 ]

6 голосов
/ 10 января 2012

Довольно просто.

"23+45".replaceAll("[+*()]", " $0 ").trim();

trim() обрезает любой конечный пробел.

Вы можете включить другие операторы следующим образом:

"23+(45*-30/2)".replaceAll("[+*()-/]", " $0 ").trim();
0 голосов
/ 10 января 2012

SavK,

вставка токенов и их повторный анализ, похоже, являются бесполезными операциями.(тем не менее, приведенное выше решение для регулярных выражений просто короткое и хорошее (+1 от меня)) В качестве альтернативы вы можете предоставить токены непосредственно алгоритму Shunting Yard (для которого нужны токены в качестве входных данных). класс (начиная с JDK 1.0) для разбора выражения для токенов.Он выполняет весь синтаксический анализ, который вам нужен, чтобы вернуть вам токены (и даже больше: получает числа в виде целых чисел).

Вот примитивная демонстрация.

package core;

import java.io.IOException;
import java.io.StreamTokenizer;
import java.io.StringReader;

public class Q {
public static void main(String[] args) {
    StreamTokenizer stok = new StreamTokenizer(new StringReader("1+(40*8)"));
    stok.parseNumbers();
    try {
        while(stok.nextToken() != StreamTokenizer.TT_EOF) {
            System.out.println("nval: "+stok.nval);
            System.out.println("sval: "+stok.sval);
            System.out.println("ttype: "+stok.ttype);
            System.out.println("toString: "+stok.toString());
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}
0 голосов
/ 10 января 2012

Идея добавления пробелов из-за разделения цели String, чем вы также можете разделить строку с помощью арифметических операторов, также используя Class StringTokenizer.Подробнее о StringTokenizer

...