如何在Java中从字符串中分离数字?

5

我有困难想到一种将字符串中的数字拆分出来的方法。我已经将字符串拆分成了多个字符。

因此,如果表达式是gi356f,则会得到:

g
i
3
5
6
f

但我希望356能够被视为一个独立的数字。我正在处理的问题涉及像(345+3)*/3这样的字符串。

我尝试查看字符串中的当前字符和下一个字符,并尝试检查它们是否是数字,如果是数字,则将它们连接在一起,但这会导致许多错误。例如,它只处理两位数的数字,并且如果字符串为43,则会重复使用3(例如一次用于43,再次用于单独的3)。此外,如果表达式以给定字符串的数字结尾,则也会重复处理。

我不确定如何解决这个问题。我想也许可以使用正则表达式或扫描仪,但即使查看了一些在线示例代码,也不确定如何去做。


1
如果你展示你已经尝试过的内容,别人可能会帮助你。 - rene
你只是想提取数字,还是想分析字符串? - Arne Deutsch
我只想提取数字,我还考虑了另一件事,就是需要处理负数和小数。因此,如果表达式为 (-1.53 +3),我想要能够提取: -1.53 3 不太确定如何检查我的字符解析器中的数字是否已经完成。 - hello world
6个回答

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

我理解这个问题,但是对于同时包含负号和小数的数字如何处理就不太确定了。比如处理-3.45这样的数字。我有遗漏了什么吗? - hello world
1
你需要做的唯一事情就是扩展正则表达式。应该很简单。不需要测试像[+-]?\d+(\.\d+)?这样的东西。只需阅读有关正则表达式的文档即可。它们专门为此类问题设计。 - Arne Deutsch

2

这里可以使用堆栈数据结构。下面是您可以执行的操作:

  1. 扫描每个字符。
  2. 检查字符是否为数字。如果是,将其放入堆栈中。
  3. 继续将字符添加到堆栈中,直到获取任何非数字字符。
  4. 一旦获取非数字字符,请从堆栈中取出所有数字字符并转换为数字。
  5. 继续执行,直到字符结束。

我正在尝试按照您所描述的方式实现,但我很难想出测试条件来检查我是指负数还是减号运算符。因此,我正在尝试将运算符存储在另一个堆栈中,将数字存储在另一个堆栈中。但我希望将-1.54视为数字并将其存储在堆栈中。 - hello world
@hello world:你能详细说明一下问题领域吗?输入字符串肯定有一些限制。它是一个数学表达式还是一串字符流? - Gaurav
它是一个数学表达式计算器,例如可以是(-1.54+3*4/2)。 - hello world
在这种情况下,应该遵循一些定义数学表达式的规则。例如:它永远不会被写成5--7。它是5-(-7)。 - Gaurav

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文档中找到所有关于Java正则表达式的详细信息。 编辑 已删除的编辑:我已经添加了所需的正则表达式的描述,但同样的正则表达式已经在另一个答案的评论中添加了,在我完成修改的几分钟前。请参考其他答案。

0
如果您不需要非数字字符,请执行以下操作:
解析字符串一次,用空格替换所有非数字字符。然后解析生成的字符串,同时删除双空格。输入字符串 gi356f 将首先变为 _356,其中_代表空格。然后,如果您删除双空格,您将得到您要查找的内容。
另一个例子 d45*9j 变成 _45_9_,然后当您将其拆分为子字符串时,您将获得 45 和 9,并且是单独的数字。
有很多方法可以做到这一点,最好的方法是尝试不同的方法,直到找到适合您的方法为止。

0

我也正在创建一个计算器,使用堆栈将方程式分成数字和运算符,就像@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 = "";

            }

        }

我发现这比处理字符串分割表达式容易得多。 我还没有处理括号之类的东西,所以代码可能会改变。


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

输出将是:

123
3464
111

请检查!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接