【问题标题】:how to extract numeric values from input string in java如何从java中的输入字符串中提取数值
【发布时间】:2012-08-31 13:11:44
【问题描述】:

如何从输入字符串中只提取数值?

例如,输入的字符串可能是这样的:

String str="abc d 1234567890pqr 54897";

我只想要数值,即"1234567890""54897"。所有字母和特殊字符都将被丢弃。

【问题讨论】:

  • 所有的字母都将被丢弃——你的意思是
  • 是的。要丢弃的字母和特殊字符我只想要那些数字。
  • 我什么都没试过,因为我完全是空白的。数值可能位于输入的开头或结尾。

标签: java string


【解决方案1】:
String str=" abc d 1234567890pqr 54897";
Pattern pattern = Pattern.compile("\\w+([0-9]+)\\w+([0-9]+)");
Matcher matcher = pattern.matcher(str);
for(int i = 0 ; i < matcher.groupCount(); i++) {
  matcher.find();
  System.out.println(matcher.group());
}

【讨论】:

    【解决方案2】:

    您可以使用Scanner 类中的.nextInt() 方法:

    将输入的下一个标记扫描为 int。

    或者,您也可以这样做:

    String str=" abc d 1234567890pqr 54897";
    
    Pattern p = Pattern.compile("(\\d+)");
    Matcher m = p.matcher(str);
    while(m.find())
    {
        System.out.println(m.group(1));
    }
    

    【讨论】:

    • 是的,但模式不固定。我的意思是,数字并不总是在“d”之后。
    • @smya.dsh:我不明白你的最新评论。 \\d+ 表示正则表达式语言中的一个或多个数字,它与字母 d 无关(至少在这种情况下)。
    【解决方案3】:
            String line = "This order was32354 placed 343434for 43411 QT ! OK?";
            String regex = "[^\\d]+";
    
            String[] str = line.split(regex);
            String required = "";
            for(String st: str){
                System.out.println(st);
            }
    

    通过上面的代码,您将获得所有数值。然后你可以合并它们或者你想对这些数值做什么。

    【讨论】:

    • 从一个长的字母数字字符串中提取数字的方法非常简单。
    【解决方案4】:

    您想丢弃除数字和空格以外的所有内容:

    String nums = input.replaceAll("[^0-9 ]", "").replaceAll(" +", " ").trim();
    

    额外的调用清除了双倍和前导/尾随空格。

    如果需要数组,添加拆分:

    String[] nums = input.replaceAll("[^0-9 ]", "").trim().split(" +");
    

    【讨论】:

    • String nums = input.replaceAll("[0-9 ]", "") 不只丢弃数字吗?
    • @fade2black 在字符类中也有一个空格字符,在9] 之间,但感谢消息:我刚刚注意到我错过了否定^。代码现在应该可以工作了。
    • 我的论点是您从原始字符串中删除所有数字。您刚刚通过添加“^”进行了编辑。你以前的正则表达式是错误的。它删除了所有数字和空格,而 OP 要求相反。
    • @fade 是的,现在我已经修复了我的错误,感谢您提请我注意。
    【解决方案5】:
    public class ExtractNum
    
    {
    
      public static void main(String args[])
    
      {
    
       String input = "abc d 1234567890pqr 54897";
    
       String digits = input.replaceAll("[^0-9.]","");
    
       System.out.println("\nGiven Number is :"+digits);
    
      }
    
     }
    

    【讨论】:

    • 这将创建一个巨大的数字,而不是将它们分开
    【解决方案6】:

    使用yourString.toCharArray(); 将您的字符串拆分为字符数组,然后遍历字符并使用Character.isDigit(ch); 来识别这是否是数值。或者遍历整个字符串并使用str.charAt(i)。例如:

    public static void main(String[] args) {
        String str = "abc d 1234567890pqr 54897";
        StringBuilder myNumbers = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            if (Character.isDigit(str.charAt(i))) {
                myNumbers.append(str.charAt(i));
                System.out.println(str.charAt(i) + " is a digit.");
            } else {
                System.out.println(str.charAt(i) + " not a digit.");
            }
        }
        System.out.println("Your numbers: " + myNumbers.toString());
    }
    

    【讨论】:

      【解决方案7】:

      你可以这样做:

      Matcher m = Pattern.compile("\\d+").matcher(str);
      while (m.find()) {
         System.out.println(m.group(0));
      }
      

      【讨论】:

        【解决方案8】:

        您可以使用str = str.replaceAll("replaced_string","replacing_string");

        String str=" abc d 1234567890pqr 54897";
        String str_rep1=" abc d ";
        String str_rep2="pqr ";
        String result1=str.replaceAll("", str_rep1);
        String result2=str.replaceAll(",",str_rep2);
        

        npinti 建议也可以使用。

        【讨论】:

        • 这只适用于这个特定的字符串:abc d 1234567890pqr 54897
        【解决方案9】:

        使用 java Scanner 类的示例

        import java.util.Scanner;
        
        Scanner s = new Scanner( "abc d 1234567890pqr 54897" );
        s.useDelimiter( "\\D+" );
        while ( s.hasNextInt() ){
            s.nextInt(); // get int
        }
        

        【讨论】:

          【解决方案10】:

          如果你不想使用正则表达式,

          String str = " abc d 1234567890pqr 54897";
          
          char[] chars = new char[str.length()];
          
          int i = 0;
          for (int j = 0; j < str.length(); j++) {
              char c = str.charAt(j);
              if (Character.isDigit(c)) {
                  chars[i++] = c;
                  if (j != chars.length - 1)
                      continue;
              }
              if (chars[0] == '\0')
                  continue;
              String num = new String(chars).trim();
              System.out.println(num);
              chars = new char[str.length()];
              i = 0;
          
          }
          

          输出: 1234567890 54897

          【讨论】:

            【解决方案11】:

            您可以在空格上拆分字符串以获取各个条目,遍历它们,并尝试使用Integer 上的相关方法解析它们,使用try/catch 方法来处理解析的情况这是一个数字失败。这可能是最直接的方法。

            或者,您可以构建一个正则表达式以仅匹配数字并使用它来查找所有数字。对于大字符串来说,这可能性能要好得多。正则表达式将看起来像 something `\b\d+\b'。

            更新:或者,如果这不是家庭作业或类似的(我有点假设您正在寻找自己实现它的线索,但这可能无效),您可以使用@npinti 提供的解决方案。这可能是您在生产代码中应该采用的方法。

            【讨论】:

            • 您对空格的建议在 1234567890pqr 的示例中会失败
            • @JonasEicher 我以为是1234567890 pqr,而不是1234567890pqr
            【解决方案12】:
            public static List<String> extractNumbers(String string) {
                List<String> numbers = new LinkedList<String>();
                char[] array = string.toCharArray();
                Stack<Character> stack = new Stack<Character>();
            
                for (int i = 0; i < array.length; i++) {
                    if (Character.isDigit(array[i])) {
                        stack.push(array[i]);
                    } else if (!stack.isEmpty()) {
                        String number = getStackContent(stack);
                        stack.clear();
                        numbers.add(number);
                    }
                }
                if(!stack.isEmpty()){
                    String number = getStackContent(stack);
                    numbers.add(number);            
                }
                return numbers;
            }
            
            private static String getStackContent(Stack<Character> stack) {
                StringBuilder sb = new StringBuilder();
                Enumeration<Character> elements = stack.elements();
                while (elements.hasMoreElements()) {
                    sb.append(elements.nextElement());
                }
                return sb.toString();
            }
            
            public static void main(String[] args) {
                String str = " abc d 1234567890pqr 54897";
                List<String> extractNumbers = extractNumbers(str);
                for (String number : extractNumbers) {
                    System.out.println(number);
                }
            }
            

            【讨论】:

              【解决方案13】:

              只需提取数字

              String str=" abc d 1234567890pqr 54897";        
              
              for(int i=0; i<str.length(); i++)
                  if( str.charAt(i) > 47 && str.charAt(i) < 58)
                      System.out.print(str.charAt(i));
              

              另一个版本

              String str=" abc d 1234567890pqr 54897";        
              boolean flag = false;
              for(int i=0; i<str.length(); i++)
                  if( str.charAt(i) > 47 && str.charAt(i) < 58) {
                      System.out.print(str.charAt(i));
                      flag = true;
                  } else {
                      System.out.print( flag ? '\n' : "");
                      flag = false;
                  }
              

              【讨论】:

                【解决方案14】:
                 public static String convertBudgetStringToPriceInteger(String budget) {
                    if (!AndroidUtils.isEmpty(budget) && !"0".equalsIgnoreCase(budget)) {
                        double numbers = getNumericFromString(budget);
                        if( budget.contains("Crore") ){
                            numbers= numbers* 10000000;
                        }else if(budget.contains("Lac")){
                            numbers= numbers* 100000;
                        }
                        return removeTrailingZeroesFromDouble(numbers);
                    }else{
                        return "0";
                    }
                }
                

                从字母数字字符串中获取数值

                 public static double getNumericFromString(String string){
                    try {
                        if(!AndroidUtils.isEmpty(string)){
                            String commaRemovedString = string.replaceAll(",","");
                            return Double.parseDouble(commaRemovedString.replaceAll("[A-z]+$", ""));
                            /*return Double.parseDouble(string.replaceAll("[^[0-9]+[.[0-9]]*]", "").trim());*/
                
                        }
                    }catch (NumberFormatException e){
                        e.printStackTrace();
                    }
                    return 0;
                }
                

                例如。如果我通过 1.5 lac 或 15,0000 或 15 千万,那么我们可以从这些函数中获得数值。我们可以根据需要自定义字符串。 例如。如果是 1.5 Lac,结果将是 150000

                【讨论】:

                  【解决方案15】:
                  String str = "abc d 1234567890pqr 54897";
                  str = str.replaceAll("[^\\d ]", "");
                  

                  结果将是“1234567890 54897”。

                  【讨论】:

                    【解决方案16】:
                    String str = "abc34bfg 56tyu";
                    
                    str = str.replaceAll("[^0-9]","");
                    

                    输出:3456

                    【讨论】:

                    • 您只添加了 parseInt 部分,它不会使以前的答案不那么正确。
                    猜你喜欢
                    • 2018-11-28
                    • 2015-01-30
                    • 1970-01-01
                    • 2016-06-18
                    • 2016-12-05
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多