2012-01-10 3 views
1

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

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

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

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

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

Я использую алгоритм сортировочной станции, так что мне нужно tokenise входа.

+0

Ваш вопрос ... и ваш код, который пытается выглядеть так ... но он делает .... вместо того, что вы ожидали, что есть .... ?? –

+0

Прямо сейчас я вставляю пробелы в сам ввод. Так что у меня пока нет кода для этого. Я написал остальную часть программы, но на самом деле это не связано с этим. – saviok

ответ

6

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

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

trim() обрезает любой замыкающий пробел.

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

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

+1. Вы забыли '-' (минус) и'/'(разделите). –

+0

Это может привести к нескольким пробелам в строке, вместо «обрезки» может быть выполнено другое «replaceAll», чтобы обрезать другие пробелы: «23 + 45» .replaceAll («[-/+ *()]», $ 0 ") .replaceAll (" \\ s + "," ");' – fivedigit

+0

@HarryJoy Обновлен мой ответ, спасибо. Но я думаю, что '-' не должно быть разделено пробелом, если оно используется как знак. Используя его как оператор, пространство в порядке. Что выглядит лучше? '2 * -4' или' 2 * - 4'? – adarshr

0

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

+0

Я не вижу смысла использовать 'StringTokenizer' в современной Java. – adarshr

+0

Это пример, который вы можете попробовать: String msg = "1+ (4 * 8)"; StringTokenizer st = new StringTokenizer (msg, "+ */-"); while (st.hasMoreTokens()) { System.out.println (st.nextToken()); –

+0

Вот что я пытался сказать. Вы должны были написать 4 строки, и это все равно не дает мне финальную строку. Для этого вам нужно добавить еще 3 строки, чтобы использовать 'StringBuilder'. – adarshr

0

Savk,

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

Попробуйте взглянуть на класс StreamTokenizer (с 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(); 
    } 
} 
} 
Смежные вопросы