2012-01-03 121 views
3

我有问题想办法分割字符串的数字。我已经完成的是将字符串拆分为多个字符。如何从Java中的字符串中拆分数字?

所以如果表达gi356f 它会给:

g 
i 
3 
5 
6 
f 

但我想356被视为在它自己的尊重一些。和我正在处理的问题包括字符串看起来像(345+3)*/3

我试着看字符串中的当前字符和下一个,并试图检查它是否是一个数字,很多错误。例如它只能处理两位数的长数字,如果字符串是43,那么它也会不太好,它会使用3次两次。 (例如43次,再次3次)。另外,如果表达式结尾处有多个给定的字符串,那么也会处理两次。

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

+1

如果你显示你已经尝试过某人可能会帮助你。 – rene 2012-01-03 12:31:06

+0

你只是想提取数字,还是你想分析字符串? – Arne 2012-01-03 12:37:11

+0

我想提取数字,我只是考虑另一件事,我需要处理负数和小数。 所以如果表达式是(-1.53​​ +3),我希望能够提取 -1.53​​ 不完全确定如何检查我的字符分析器中的数字是否已完成。 – 2012-01-03 12:38:58

回答

1

堆栈数据结构可能对此有所帮助。因此,您可以执行以下操作:

  1. 扫描每个字符。
  2. 检查char是否是数字。如果是的话,放入堆栈。
  3. 继续添加char到堆栈,直到获得任何非数字字符。
  4. 一旦您获得了非数字字符,从堆栈中取出所有数字字符并转换为数字。
  5. 继续直到字符未完成。
+0

我正在试图像你所描述的那样实施,我正努力考虑测试条件,以检查我的意思是负数还是负数。 因为,即时尝试将运营商存储在另一个堆栈和数字在另一个。但我想把-1.54当成一个数字并将其存储在一个堆栈中 – 2012-01-03 13:11:20

+0

@hello world:你能否在精确问题域上投射更多光线。传入的字符串必须有一些限制。这是一个数学表达式还是一个字符流? – Gaurav 2012-01-03 16:50:26

+0

这是一个数学表达式计算器,例如它可以是(-1.54 + 3 * 4/2) – 2012-01-03 18:37:36

0

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

解析字符串一次,用一个空格替换所有非数字字符。解析生成的字符串,在你走的时候删除双空格。输入字符串gi356f将首先变为_ ,_为空格。如果你然后删除双空格,你会有你在找什么。

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

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

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

我明白这一点,但有了这个,不知道处理的数字有 - 和小数的组合。例如处理诸如-3.45的数字。我错过了什么吗? – 2012-01-03 13:28:12

+1

你唯一需要做的就是扩展正则表达式。应该很简单。没有测试像[+ - ]?\\ d +(\\。\\ d +)?之类的东西。请阅读有关正则表达式的文档。它们正是为这种类型的问题而设计的。 – Arne 2012-01-03 14:10:26

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 documentation

编辑

删除编辑:我已经添加了所需的正则表达式的说明,但同样的正则表达式已添加作为在我可以完成我的更改之前几分钟的另一个答案的评论。请参阅其他答案。

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

输出将是:

123 
3464 
111 

退房!

0

我也创建了一个计算器,我使用Stacks将公式分解为Numbers和Operators,就像@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 = ""; 

      } 

     } 

我发现它比处理字符串拆分表达式要容易得多。 我不处理括号和东西,所以代码可能会改变..