2012-01-10 75 views
1

我想在我的字符串的某些部分插入空格。 我正在写一个计算器计算器。插入字符串的某些部分

例如,对于字符串

"23+45"我希望它是"23 + 45"

"1+(4*8)" as "1 + (4 * 8)"

我这样做,这样我可以根据空间分割字符串,

我使用的调度场算法,所以我需要tokenise输入。

+0

你的问题是....和你的代码,这尝试这看起来像....但它确实....而不是你所期望的是.... ??? – 2012-01-10 10:13:58

+0

现在我在输入本身中插入空格。所以我还没有真正的代码。我已经编写了程序的其余部分,但那不是真的与此有关。 – saviok 2012-01-10 10:16:38

回答

6

很简单。

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

trim()修剪任何尾随空格。

您可以包括其他运营商像这样:

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

+1。你忘了'-'(减号)和'/'(除)。 – 2012-01-10 10:19:24

+0

这可能会导致字符串中出现多个空格,可以使用另一个'replaceAll'来代替修剪来修剪其他空格:''23 + 45“.replaceAll(”[ -/+ *()]“,” $ 0“).replaceAll(”\\ s +“,”“);' – fivedigit 2012-01-10 10:21:51

+0

@HarryJoy更新了我的答案,谢谢。但我认为''不应该被空格隔开,如果用作符号的话。用它作为操作符,空间很好。哪个更好看? '2 * -4'或'2 * - 4'? – adarshr 2012-01-10 10:22:49

0

的想法添加,因为分裂字符串目的,比你还可以通过拆分算术运算符也用Class StringTokenizer字符串的空间。 更多关于StringTokenizer

+0

在现代Java中我没有看到使用'StringTokenizer'的任何一点。 – adarshr 2012-01-10 10:29:56

+0

这是一个你可以尝试的例子: String msg =“1+(4 * 8)”; StringTokenizer st = new StringTokenizer(msg,“+ */- ”); (st.hasMoreTokens()){System.out.println(st。的nextToken()); – 2012-01-10 10:37:08

+0

这就是我想说的。你必须写4行,它仍然不给我最后的字符串。要做到这一点,你必须添加另外3行来使用'StringBuilder'。 – adarshr 2012-01-10 10:44:31

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(); 
    } 
} 
}