如何在Java中拆分字符串中的数字?

时间:2012-01-03 12:29:01

标签: java string

我在思考分割字符串数量的方法时遇到了问题。我已经做的就是将字符串拆分成多个字符。

所以如果表达式为gi356f 它会给:

g
i
3
5
6
f

但我希望将356视为自己尊重的数字。我正在处理的问题包括看起来像(345+3)*/3

的字符串

我尝试查看字符串和下一个字符串中的当前字符,并尝试检查它是否为数字,如果是,则附加它们但这会导致许多错误。例如,它只能处理两位数的长数字而且不太好,如果字符串是43,它将使用3两次。 (例如,一次是43次,另一次是3次)。此外,如果最后的表达式以一定数量的给定字符串结束,如果也将被处理两次。

我不确定如何解决这个问题。我想也许可以使用正则表达式或扫描仪,但不知道如何去做,即使在网上查看一些较小的例子的代码。

6 个答案:

答案 0 :(得分:3)

您可以使用正则表达式。这是简单情况的解决方案(只是整数)。 \\d是小数,加号+表示一次或多次。有关更多信息,请查看http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

import java.util.regex.*;

public class Main {
  public static void main(String[] args) {
    Pattern p = Pattern.compile("\\d+");
    Matcher m = p.matcher("(345+3)*/3");
    while(m.find())
      System.out.println(m.group());
  }
}

答案 1 :(得分:1)

堆栈数据结构可能有所帮助。所以你可以做到这一点:

  1. 扫描每个角色。
  2. 检查字符是否为数字。如果是,请放入堆栈。
  3. 继续将char添加到堆栈,直到获得任何非数字字符。
  4. 获得非数字字符后,从堆栈中取出所有数字字符并转换为数字。
  5. 继续直到炭未完成。

答案 2 :(得分:1)

您可以使用正则表达式。这是一个(非常粗略)草图:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

String findIntegerOccurrence(String inputString)
{
    // Define pattern to match your numbers here.
    Pattern pattern = Pattern.compile("... reg expr here...");
    Matcher matcher = pattern.matcher(inputString);

    if (matcher.find()) // Checks if the regular expression matches.
    {
        // Extract the substring of inputString that has matched
        return matcher.group();
    }
    else
    {
        return null;
    }
}

您基本上需要为数字定义适当的正则表达式,然后使用它来查找输入字符串中的所有匹配项。上面的示例只是一个草图,可以看到如何定义正则表达式并匹配它。由于您希望匹配所有出现的数字并将它们与输入的其余部分分开,因此您需要一个更精细的解决方案(上面的示例仅显示您需要的类和一些有用的方法)。

您可以在Java documentation

中找到有关Java中正则表达式的所有详细信息

修改

删除编辑:我添加了所需正则表达式的描述,但在我完成更改前几分钟,已将相同的正则表达式添加为另一个答案的注释。请参考其他答案。

答案 3 :(得分:0)

如果您不需要非数字字符,请执行以下操作:

解析字符串一次,用空格替换所有非数字字符。解析生成的字符串,随着时间的推移删除双重空格。输入字符串gi356f首先变为_ 356 ,_为空格。如果你删除了双重空格,那么你就得到了你想要的东西。

另一个例子d45 * 9j变为_45_9_然后,当你将它分成子串时,你将有45和9以及单独的数字。

有很多方法可以做到这一点,最好的方法是尝试不同的方法,直到找到适合你的方法。

答案 4 :(得分:0)

我也正在创建一个计算器,我正在使用Stacks将方程式分为数字和运算符,就像@Gaurav所说的那样。这是我正在使用的代码:

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

            equationChar = String.valueOf(equation.charAt(i));

            if (numbers.contains(equationChar)) {

                equationHold += equationChar;

                if (i==(equation.length()-1)) {

                    stackNumbers.push(equationHold);    
                }

            } else {

                stackNumbers.push(equationHold);
                stackOperators.push(equationChar);
                equationHold = "";

            }

        }

我发现它比处理String Split表达式更容易。 我还没有处理括号和内容,所以代码可能会改变..

答案 5 :(得分:-1)

Pattern pp = Pattern.compile("\\d+");
Matcher m = pp.matcher("sdfsdf123sdfs3464ew111");
While(m.find())
{
    System.out.println(m.group());
}

输出将是:

123
3464
111

退房!