2016-02-12 107 views
2

java中用于从文本中提取数字并解析它的最佳实践是什么?解析(转换)包含数字的字符串数字类型

例如:

String s = "Availability in 20 days"; 

请不要只是坚持我在寻找一个好的一般的做法和情景的例子。

谢谢。

+0

如果输入的是 “号码134来第二次”,那么你要输出什么? – Hackerdarshi

+0

我在想这可能是一个数字集合。但我宁愿忽略数字与文字棍子 – kidwon

+0

@kidwon请继续并接受答案。或者如果您能够想出一些可以帮助社区的最佳做法,请输入您自己的答案并接受它。 –

回答

1

使用正则表达式:

Pattern p = Pattern.compile("-?\\d+"); 
Matcher m = p.matcher("Availability in 20 days"); 
while (m.find()) { 
    int number = Integer.parseInt(m.group()); 
    ... 
} 
1

怎么样的正则表达式+的replaceAll?

代码:

String after = str.replaceAll("\\D+", ""); 
+0

它必须是'“\\ D +”'。 – saka1029

+0

谢谢我修好了。奇怪,昨天它看起来像2斜线......但.. –

1

我不清楚自己想做的事,但这里有一些解决方案,可以帮助你:

  1. 列表项目使用.indexOf和.substring找到号码字符串

    • 例如:

      String s; 
      String str = new String("1 sentence containing 5 words and 3 numbers."); 
      ArrayList<Integer> integers = new ArrayList<Integer>(); 
      for (int i = 0; i <= 9; i++) { 
          int start = 0; 
          while (start != -1) { 
           String sub = str.substring(start); 
           int x = sub.indexOf(i); 
           if (x != -1) { 
            s = sub.substring(x, x+1); 
            integers.add(Integer.parseInt(s)); 
            start = x; 
           } else { 
            //number not found 
            start = -1; 
           } 
          } 
      } 
      
  2. 一次提取一个字符并尝试解析它,如果没有例外,它是一个数字。我肯定不建议这个解决方案,但它也应该工作。不幸的是,我不能告诉你哪种方法更快,但我可以想象 - 尽管命令较少 - 第二个版本更慢,考虑到有几个例外抛出。

    String s; 
    int integ; 
    ArrayList<Integer> integers = new ArrayList<Integer>(); 
    String str = new String("1 sentence containing 5 words and 3 numbers."); 
    for (int i = 0; i < str.length(); i++) { 
        s = str.substring(i,i+1); 
        try { 
         integ = Integer.parseInt(s); 
         integers.add(integ); 
        } catch (NumberFormatException nfe) { 
         //nothing 
        } 
    } 
    
0

如果有serveral的数字则

String[] after = str.replaceAll("\\D+", " ").split("\\s+");