将数字和符号提取到数组中?

时间:2014-03-22 01:03:47

标签: java string

考虑下面的字符串:

1.2+3.4*(3.2+2.3)-12.1/3.4*1.8+5.7

如何将每个double和每个符号提取到一个数组中,如下所示?

a[1]=1.2,a[2]=+,a[3]=3.4,a[4]=*,a[5]=(...

4 个答案:

答案 0 :(得分:1)

在正则表达式的帮助下:

String s = "1.2+3.4*(3.2+2.3)-12.1/3.4*1.8+5.7";
s.split("(?=[^\\d\\.])|(?<=[^\\d\\.])");
System.out.println("Got: " + Arrays.toString(result));

将完成这项工作,让我解释一下这个正则表达式的想法: 第一部分(?= [^ \ d \。])只有在向前看我才能看到一个数字或'。',前瞻不会移动光标所以如果我们将这部分单独应用于表达式我们会得到:

[1.2, +3.4, *, (3.2, +2.3, ), -12.1, /3.4, *1.8, +5.7]

现在你可以看到,如果lookbehind不是一个点或一个数字,我们需要放置第二个分割点 - 这是第二部分的工作:(?<=[^\\d\\.]),如果我们将这些部分组合成我们的结果得到的将是预期的:

[1.2, +, 3.4, *, (, 3.2, +, 2.3, ), -, 12.1, /, 3.4, *, 1.8, +, 5.7]

答案 1 :(得分:1)

您可以检查每个字符并确定它是双重字符还是操作符的一部分。

一般的想法是:

循环遍历字符串,一次检查一个字符:

如果当前字符为&#34;(&#34;,则将括号内的所有内容添加到currentDouble。

否则,如果当前字符是运算符,则将currentDouble和current运算符添加到ArrayList。

否则,当前字符必须是double的一部分,为currentDouble添加字符。

 public static void main(String[]args){
    String expression = "1.2+3.4*(3.2+2.3)-12.1/3.4*1.8+5.7";
    String currentDouble = "";
    ArrayList myArray = new ArrayList();

    for(int i=0; i<expression.length(); i++){
        String current = ""+expression.charAt(i);
        if(current.equals("(")){
            String subExpression = expression.substring(i,expression.indexOf(")",i+1)+1);

            currentDouble+=subExpression;
            i+=subExpression.length()-1;
        }
        else if("+-*/".contains(current)){
            myArray.add(currentDouble);
            currentDouble = "";
            myArray.add(current);
        }
        else{
            currentDouble+=current;
        }
    }

    myArray.add(currentDouble);

    System.out.println(myArray.toString());
    /* USE THIS TO TURN ARRAYLIST INTO STANDARD ARRAY
    Object[] array = myArray.toArray();
    */
}

输出:

[1.2, +, 3.4, *, (3.2+2.3), -, 12.1, /, 3.4, *, 1.8, +, 5.7]

答案 2 :(得分:0)

以下是您如何在一行中完成的工作:

String[] elements = input.split("(?<=\\d)(?=[^\\d.])|(?<=[^\\d.])(?=\\d)|(?<=[()])|(?=[()])");

这可以通过使用(非消费)环视来分割任何一个:

  • 数字后跟非数字(点除外)
  • 非数字(除了一个点)后跟数字
  • 在任何支架之后
  • 在任何支架之前

这是一些测试代码:

String input = "1.2+3.4*(3.2+2.3)-12.1/3.4*1.8+5.7";
String[] elements = input.split("(?<=\\d)(?=[^\\d.])|(?<=[^\\d.])(?=\\d)|(?<=[()])|(?=[()])");
System.out.println(Arrays.toString(elements));

输出:

[1.2, +, 3.4, *, (, 3.2, +, 2.3, ), -, 12.1, /, 3.4, *, 1.8, +, 5.7]

答案 3 :(得分:0)

出于性能原因,应尽可能避免使用相同字符串上的许多正则表达式。最快的字符串算法是对输入字符串的字符执行最小数量比较的算法。话虽如此:

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class ExtractNumbers {

    public static void main(String[] args) throws Exception {
        String text = "1.2+3.4*(3.2+2.3)-12.1/3.4*1.8+5.7";

        List<String> list = new LinkedList<String>();

        // Holds a number being parsed. 
        StringBuilder buff = new StringBuilder();
        for (int i = 0; i < text.length(); i++) {

            char c = text.charAt(i);

            if (Character.isDigit(c) || c == '.') {
                buff.append(c);
            } else {
                flushBuffer(list, buff);
                list.add(Character.toString(c));
            }
        }

        flushBuffer(list, buff);

        String[] array = list.toArray(new String[0]);
        System.out.println(Arrays.toString(array));
        // prints [1.2, +, 3.4, *, (, 3.2, +, 2.3, ), -, 12.1, /, 3.4, *, 1.8, +, 5.7]
    }

    private static void flushBuffer(List<String> list, StringBuilder buff) {
        int l = buff.length();
        if (l > 0) {
            list.add(buff.toString());
            buff.delete(0, l);
        }
    }
}

这段代码之后。我仍然认为你正在寻找一个表达式解析器。哪个比这个片段更复杂。