【问题标题】:JAVA: Space delimiting all non-numerical characters in a StringJAVA:空格分隔字符串中的所有非数字字符
【发布时间】: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,那是一个错字。

标签: java string csv


【解决方案1】:

这样的东西应该可以工作......

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

【讨论】:

  • 错误的迭代:您使用的是charAt,而您需要在通用代码中使用codePointAt。而且您有时必须额外增加一个i。 UTF-16 是一种可变宽度编码,您的代码错误地将其视为 UCS-2。
  • 很高兴看到答案有所帮助,很遗憾看到您无法投票!
  • 是的。如果我们考虑您的“类似这样的事情”的资格陈述,那么是的,您确实正确回答了我的问题。
  • 谢谢!我知道这不会是最终的工作答案。很高兴你能成功。
  • 已经过了一年,但我终于有 15 个代表了。所以我赞成你的回答。
【解决方案2】:
  1. 在数学方程式+ - * / () 等中定义运算
  2. 将方程字符串转换为char[]
  3. 一次遍历char[] 一个字符并将读取的字符附加到StringBuilder 对象。
  4. 如果遇到任何与定义的操作匹配的字符,则在该字符前后添加一个空格,然后将其附加到StringBuilder 对象。
    好吧,这是您可以实现的算法之一。可能还有其他方法可以做到这一点。

【讨论】:

  • 不,你不能一次遍历一个字符单元的字符串。您一次通过它们一个代码点!
猜你喜欢
  • 2021-12-12
  • 2022-12-08
  • 2010-12-01
  • 1970-01-01
  • 2012-02-14
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
相关资源
最近更新 更多