2013-04-29 286 views
2

数组如果我有:将字符串转换为字符串

Scanner input = new Scanner(System.in); 

System.out.println("Enter an infixed expression:"); 
String expression = input.nextLine(); 

String[] tokens; 

如何扫描周围的空间中缀表达式一次一个令牌,由左到右,投放到字符串数组?这里的token被定义为一个操作数,运算符或圆括号。

示例: “3 +(9-2)” ==>令牌= [3] [+] [(] [9] [ - ] [2] [)]

+4

字符串的'length()'和'charAt(int)'可能会有所帮助。不要使用数组,请使用列表。 – 2013-04-29 18:34:43

+1

输入字符之间总会有空格吗?你的例子表明不是,但你也提到“周围空间”。 – 2013-04-29 18:38:15

回答

0

我认为这将是最简单的方法是将行读入一个字符串,然后根据空间进行拆分。有一个方便的字符串函数split可以为你做到这一点。

String[] tokens = input.split(""); 
+0

我不确定你需要拆分空间。 – Achrome 2013-04-29 18:38:50

+0

啊,你是对的。没有看到'-'标志之间没有空格。修复。 – nook 2013-04-29 18:40:41

+0

This results in:[3] [] [+] [] [(] [9] [ - ] [2] [)]。带空格的索引不需要在那里 – AlishasPayPal 2013-04-29 18:46:03

2
String test = "13 + (9-2)"; 

List<String> allMatches = new ArrayList<String>(); 
Matcher m = Pattern.compile("\\d+|\\(|\\)|\\+|\\*|-|/") 
    .matcher(test); 
while (m.find()) { 
    allMatches.add(m.group()); 
} 

有人可以测试这个吗?

+1

这肯定会分裂数字? '13'会变成'[1] [3]'。 – 2013-04-29 18:51:29

+0

@DuncanJones它会,我添加了一些新的代码,但我现在不能运行它 – 2013-04-29 18:58:52

+0

对不起,不起作用。它找到了数字,但也有很多空的字符串。 – 2013-04-29 19:16:39

0

这可能是矫枉过正的例子,但如果它变得更复杂,请看看Java编译器编译器JavaCC。 JavaCC允许您基于语法定义在Java中创建解析器。

请注意,这不是一个简单易用的工具。但是,语法定义比相应的正则表达式更容易阅读。

0

如果令牌[]必须为String可以使用此

String ex="3 + (9-2)"; 
    String tokens[]; 
    StringTokenizer tok=new StringTokenizer(ex); 
    String line=""; 
    while(tok.hasMoreTokens())line+=tok.nextToken(); 

    tokens=new String[line.length()]; 
    for(int i=1;i<line.length()+1;i++)tokens[i-1]=line.substring(i-1,i); 

令牌可以是一个charArray这样:

String ex="3 + (9-2)"; 
    char tokens[]; 
    StringTokenizer tok=new StringTokenizer(ex); 
    String line=""; 
    while(tok.hasMoreTokens())line+=tok.nextToken(); 

    tokens=line.toCharArray(); 
0

的码本(IMHO优雅)单线作品(测试):

String[] tokens = input.split("(?<=[^ ])(?<!\\B) *"); 

这个正则表达式还适用于包含多个字符数(例如123)的输入,这些字符数将被拆分成单独的cha但是对于非字边界的负面后视(?<!\\B)

第一个后视(?<=[^ ])可防止初始空白字符串在开始输入时分裂,并确保空间被消耗。

正则表达式" *"的最后一部分确保消耗空间。