JAVA:分隔字符串中所有非数字字符的空间

JAVA:分隔字符串中所有非数字字符的空间,java,string,delimited-text,Java,String,Delimited Text,在为所有非数字字符添加空格的特殊情况下,我在修改字符串以空格分隔时遇到了一些问题 我的代码必须获取一个表示数学方程的字符串,并将其拆分为各个部分。它使用值之间的空格分隔来实现这一点。如果字符串已经被分隔,那么这一部分非常有效。 问题是我并不总是得到以空格分隔的输入。为了解决这个问题,我想首先插入这些空格,以便正确创建数组 我的代码必须做的是接受任何不是数字的字符,并在其前后添加空格 大概是这样的: 3*24+321变为3*24+321 或 3.0*2.5变为3.0*2.5 显然,我需要避免在数字

在为所有非数字字符添加空格的特殊情况下,我在修改字符串以空格分隔时遇到了一些问题

我的代码必须获取一个表示数学方程的字符串,并将其拆分为各个部分。它使用值之间的空格分隔来实现这一点。如果字符串已经被分隔,那么这一部分非常有效。 问题是我并不总是得到以空格分隔的输入。为了解决这个问题,我想首先插入这些空格,以便正确创建数组

我的代码必须做的是接受任何不是数字的字符,并在其前后添加空格

大概是这样的: 3*24+321变为3*24+321 或 3.0*2.5变为3.0*2.5

显然,我需要避免在数字中插入空格,否则2.5变成2。5,然后作为3个元素输入数组。事实并非如此

到目前为止,我已经尝试使用

字符串InputLineDelmit=InputLine.replaceAll\B

它成功地将所有字母的字符串abcd更改为b c d 但当它遇到数字时就会出错。使用这种方法,我得到:

1*2变为1*2-*数字必须与括号分开

12.7+3.1变为12.7+3.1---*12.7被拆分

51/3变为51/3---*同一问题

5*4-2一点也不改变

因此,我知道\D可以用作java中所有非数字的正则表达式。但是,我试图通过替换或将其与上面的\B组合来实现这一点,这导致了编译器错误,或者用空格替换字符,而不是添加空格

编辑:

回答====

它不会让我添加我自己的答案,因为我是新的,但编辑neo108的代码,在下面,它本身不工作,没有工作。我所做的是将它改为检查isDigit,而不是Isleter,然后在这种情况下,或者在十进制的特殊情况下,对double不做任何操作。否则,字符将被更改为两边都有空格

public static void main(String[] args){


    String formula = "12+((13.0)*(2.5)-17*2)+(100/3)-7";

    StringBuilder builder = new StringBuilder();

    for (int i = 0; i < formula.length(); i++){

        char c = formula.charAt(i);
        char cdot = '.';

        if(Character.isDigit(c) || c == cdot) {
        builder.append(c);
        }
        else {
        builder.append(" "+c+" ");
        }
    }   

    System.out.println("OUTPUT:" + builder);


}
输出:12+13.0*2.5-17*2+100/3-7

然而,任何关于如何更简洁地实现这一点的想法,以及StringBuilders的合理解释,都将不胜感激。也就是我在javadocs上读到的16个字符的限制,正如上面的示例所示,您可以有更多的输出

在数学方程+-*/etc中定义运算 将等式字符串转换为char[] 每次遍历char[]一个字符,并将读取的字符附加到StringBuilder对象。 如果遇到与定义的操作匹配的任何字符,请在该字符前后添加空格,然后将该空格附加到StringBuilder对象。 这是你可以实现的算法之一。也许还有其他的方法。 在数学方程+-*/etc中定义运算 将等式字符串转换为char[] 每次遍历char[]一个字符,并将读取的字符附加到StringBuilder对象。 如果遇到与定义的操作匹配的任何字符,请在该字符前后添加空格,然后将该空格附加到StringBuilder对象。 这是你可以实现的算法之一。也许还有其他的方法。
像这样的东西应该有用

String formula = "Ab((3.0)*(2.5))";
StringBuilder builder = new StringBuilder();
for (int i = 0; i < formula.length(); i++){
    char c = formula.charAt(i);
    if(Character.isLetter(c)) {
        builder.append(" "+c+" ");
    } else {
        builder.append(c);
    }
}

像这样的东西应该有用

String formula = "Ab((3.0)*(2.5))";
StringBuilder builder = new StringBuilder();
for (int i = 0; i < formula.length(); i++){
    char c = formula.charAt(i);
    if(Character.isLetter(c)) {
        builder.append(" "+c+" ");
    } else {
        builder.append(c);
    }
}

实际上,\PN是正则表达式中的非数字字符\D通常与[^0-9]相同,或者与Java 7中Pattern.UNICODE_CHARACTER_类编译标志下的\P{Nd}相同。顺便说一句,您的\B缺少反斜杠,因为Java缺少第一类正则表达式。您的意思是\\B-也就是说,\\B-表示无边界吗?请注意,Java 7之前的Java边界被打破。是的,我的意思是\\B,这是一个输入错误。实际上,\\PN是正则表达式中的非数字字符\D通常与[^0-9]相同,或者与Java 7中Pattern.UNICODE_CHARACTER_类编译标志下的\P{Nd}相同。顺便说一句,您的\B缺少反斜杠,因为Java缺少第一类正则表达式。您的意思是\\B-也就是说,\\B-表示无边界吗?请注意,在Java 7之前,Java边界是被打破的。是的,我的意思是\\B,这是一个输入错误。不,您不能一次一个字符单元地遍历字符串。你一次通过一个代码点!不,不能一次一个字符单元地遍历字符串。你一次通过一个代码点!错误的迭代:您使用的是charAt,需要在通用代码中使用codePointAt。而且你得不时地多碰一次你的i。UTF-16是一种可变宽度编码,您的代码错误地将其视为UCS-2。很高兴看到答案有帮助&很遗憾看到您无法向上投票!对如果我们考虑你的资格声明这样的事情,那么,是的,你确实回答了我的问题。谢谢!我知道这不是最终的有效答案。很高兴你能成功。已经一年了,但我终于有了15个代表。所以我投了更高的票
你的答案。错误的迭代:你正在使用charAt,你需要在通用代码中使用codePointAt。而且你得不时地多碰一次你的i。UTF-16是一种可变宽度编码,您的代码错误地将其视为UCS-2。很高兴看到答案有帮助&很遗憾看到您无法向上投票!对如果我们考虑你的资格声明这样的事情,那么,是的,你确实回答了我的问题。谢谢!我知道这不是最终的有效答案。很高兴你能成功。已经一年了,但我终于有了15个代表。所以我对你的答案投了赞成票。