【发布时间】:2012-03-09 05:01:51
【问题描述】:
在为所有非数字字符添加空格的特殊情况下,我在将字符串修改为空格分隔时遇到了一些麻烦。
我的代码必须采用一个表示数学方程式的字符串,并将其拆分为各个部分。它使用值之间的空格分隔来做到这一点如果字符串已经分隔,这部分效果很好。 问题是我并不总是得到空格分隔的输入。为了解决这个问题,我想先插入这些空格,以便正确创建数组。
我的代码必须做的是获取任何不是数字的字符,并在其前后添加一个空格。
类似这样的: 3*24+321 变成 3 * 24 + 321 或者 ((3.0)*(2.5)) 变为 ( ( 3.0 ) * ( 2.5 ) )
显然我需要避免在数字中插入空格,否则 2.5 会变成 2 。 5,然后作为3个元素进入数组。它不是。
到目前为止,我已经尝试过使用
String InputLineDelmit = InputLine.replaceAll("\B", " ");
成功地将所有字母“abcd”的字符串更改为“a b c d” 但是当它遇到数字时会出错。使用这种方法,我得到了:
(((1)*(2))) 变为 ( ( (1) * (2) ) ) ---- * 数字必须与括号分开
12.7+3.1变成1 2.7+3.1 ----- * 12.7被拆分
51/3 变成 5 1/3 ----- * 同样的问题
而 5*4-2 根本没有变化。
所以,我知道 \D 可以用作 java 中所有非数字的正则表达式。 但是,我尝试实现这一点(通过替换或与上面的 \B 组合) 导致编译器错误或者它用空格替换字符,而不是添加一个。
编辑:
==== 已回答! ====
它不会让我添加自己的答案,因为我是新手,但是对下面 neo108 代码的编辑(它本身不起作用)完成了这项工作。我所做的是将它更改为检查 isDigit,而不是 isLetter,然后在这种情况下什么也不做(或者在小数的特殊情况下,对于双精度数)。否则,字符将更改为两边都有空格。
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 个字符的限制是什么,如上例所示,您可以有更多的输出。
【问题讨论】:
-
其实
\PN是一个正则表达式中的非数字字符;\D通常与[^0-9]相同,或者与Java 7 的Pattern.UNICODE_CHARACTER_CLASS编译标志下的\P{Nd}相同。顺便说一句,您的"\B"缺少反斜杠,因为Java 缺少第一类正则表达式。你的意思是"\\B"——也就是\B——代表一个无边界的吗?请注意,Java 边界在 Java 7 之前被打破。 -
是的,我的意思是 \\B,那是一个错字。