【问题标题】:Check and extract a number from a String in Java在 Java 中检查并从字符串中提取一个数字
【发布时间】:2013-09-06 14:33:23
【问题描述】:

我正在编写一个程序,其中用户输入以下格式的字符串:

"What is the square of 10?"
  1. 我需要检查字符串中是否有数字
  2. 然后只提取数字。
  3. 如果我使用.contains("\\d+").contains("[0-9]+"),无论输入是什么,程序都无法在字符串中找到数字,但.matches("\\d+")只有在只有数字时才能工作。

我可以使用什么作为查找和提取的解决方案?

【问题讨论】:

  • 如果要提取第一个数字,而不仅仅是输入字符串中的数字,请参阅我的回答。

标签: java regex string


【解决方案1】:

尝试以下模式:

.matches("[a-zA-Z ]*\\d+.*")

【讨论】:

  • 但是,如果用户有礼貌并说"please",这将失败。另外,在 OP 的示例中,有一个“?”占。
  • 你确定你已经修复了吗?
  • 此表达式不适用于像"10" 示例这样的答案。
【解决方案2】:

试试这个

str.matches(".*\\d.*");

【讨论】:

  • 双反斜杠有什么作用?
  • 解释一下: .* 表示从 0 到无限出现的任何字符,而不是 \\d+ (我认为双反斜杠只是为了逃避第二个反斜杠)和 \d+ 表示从 1 次到无限。
  • 这不是外星魔法,而是神秘的 BS,从没有人能做到这一点,但发明它的工程师的时代开始,因为它基本上是一个只有创造者知道的密码,直到他们分享它。
  • 修改,因为如果只有一位数字,解决方案就足够了,在这种情况下不需要有1位或更多位。
【解决方案3】:
Pattern p = Pattern.compile("(([A-Z].*[0-9])");
Matcher m = p.matcher("TEST 123");
boolean b = m.find();
System.out.println(b);

【讨论】:

  • 第一行有小错误,字符串中缺少括号。模式 p = Pattern.compile("(([A-Z].*[0-9]))");
  • 另外,这不起作用...测试有效,但 123TEST 不起作用。
【解决方案4】:

你可以试试这个

String text = "ddd123.0114cc";
    String numOnly = text.replaceAll("\\p{Alpha}","");
    try {
        double numVal = Double.valueOf(numOnly);
        System.out.println(text +" contains numbers");
    } catch (NumberFormatException e){
        System.out.println(text+" not contains numbers");
    }     

【讨论】:

    【解决方案5】:

    由于您不仅要查找数字还要提取它,因此您应该编写一个小函数来为您做这件事。一个字母一个字母地去,直到你找到一个数字。啊,刚刚在 stackoverflow 上为您找到了必要的代码:find integer in string。查看接受的答案。

    【讨论】:

      【解决方案6】:

      我认为它比正则表达式更快。

      public final boolean containsDigit(String s) {
          boolean containsDigit = false;
      
          if (s != null && !s.isEmpty()) {
              for (char c : s.toCharArray()) {
                  if (containsDigit = Character.isDigit(c)) {
                      break;
                  }
              }
          }
      
          return containsDigit;
      }
      

      【讨论】:

      • 很抱歉我没有看到提取。如果您想提取字符串中的数字,您可以轻松编辑此代码。
      【解决方案7】:

      如果你想从输入字符串中提取第一个数字,你可以这样做-

      public static String extractNumber(final String str) {                
          
          if(str == null || str.isEmpty()) return "";
          
          StringBuilder sb = new StringBuilder();
          boolean found = false;
          for(char c : str.toCharArray()){
              if(Character.isDigit(c)){
                  sb.append(c);
                  found = true;
              } else if(found){
                  // If we already found a digit before and this char is not a digit, stop looping
                  break;                
              }
          }
          
          return sb.toString();
      }
      

      例子:

      对于输入“123abc”,上述方法将返回123。

      对于“abc1000def”,1000。

      对于“555abc45”,555。

      对于“abc”,将返回一个空字符串。

      【讨论】:

        【解决方案8】:

        我采用的解决方案如下所示:

        Pattern numberPat = Pattern.compile("\\d+");
        Matcher matcher1 = numberPat.matcher(line);
        
        Pattern stringPat = Pattern.compile("What is the square of", Pattern.CASE_INSENSITIVE);
        Matcher matcher2 = stringPat.matcher(line);
        
        if (matcher1.find() && matcher2.find())
        {
            int number = Integer.parseInt(matcher1.group());                    
            pw.println(number + " squared = " + (number * number));
        }
        

        我确信这不是一个完美的解决方案,但它适合我的需要。谢谢大家的帮助。 :)

        【讨论】:

          【解决方案9】:

          下面的代码足以“检查字符串是否包含Java中的数字”

          Pattern p = Pattern.compile("([0-9])");
          Matcher m = p.matcher("Here is ur string");
          
          if(m.find()){
              System.out.println("Hello "+m.find());
          }
          

          【讨论】:

            【解决方案10】:

            s=s.replaceAll("[*a-zA-Z]", "") 替换所有字母

            s=s.replaceAll("[*0-9]", "") 替换所有数字

            如果你做了以上两个替换,你会得到所有特殊字符的字符串

            如果您只想从 String s=s.replaceAll("[^0-9]", "") 中提取整数

            如果您只想从 String s=s.replaceAll("[^a-zA-Z]", "") 中提取字母

            编码愉快:)

            【讨论】:

              【解决方案11】:
              public String hasNums(String str) {
                      char[] nums = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
                      char[] toChar = new char[str.length()];
                      for (int i = 0; i < str.length(); i++) {
                          toChar[i] = str.charAt(i);
                          for (int j = 0; j < nums.length; j++) {
                              if (toChar[i] == nums[j]) { return str; }
                          }
                      }
                      return "None";
                  }
              

              【讨论】:

                【解决方案12】:

                .matches(".*\\d+.*") 仅适用于数字,但不适用于 //* 等其他符号。

                【讨论】:

                  【解决方案13】:

                  ASCII 在 UNICODE 的开头,所以你可以这样做:

                  (x >= 97 && x <= 122) || (x >= 65 && x <= 90) // 97 == 'a' and 65 = 'A'
                  

                  我相信您可以找出其他值...

                  【讨论】:

                    【解决方案14】:

                    我找不到一个正确的模式。 请按照以下指南获取一个小而甜蜜的解决方案。

                    String regex = "(.)*(\\d)(.)*";      
                    Pattern pattern = Pattern.compile(regex);
                    String msg = "What is the square of 10?";
                    boolean containsNumber = pattern.matcher(msg).matches();
                    

                    【讨论】:

                    • 这很好用。您唯一需要注意的是字符串是否包含反斜杠。如果是这样,那么我认为这会产生“非法转义字符”错误。
                    • 这是最好的
                    【解决方案15】:

                    下面的代码 sn-p 将判断字符串是否包含数字

                    str.matches(".*\\d.*")
                    or
                    str.matches(.*[0-9].*)
                    

                    例如

                    String str = "abhinav123";
                    
                    str.matches(".*\\d.*") or str.matches(.*[0-9].*)  will return true 
                    
                    str = "abhinav";
                    
                    str.matches(".*\\d.*") or str.matches(.*[0-9].*)  will return false
                    

                    【讨论】:

                      【解决方案16】:

                      由于我被重定向到此处以寻找一种在 Kotlin 语言中查找字符串中数字的方法,因此我将把我的发现留给其他想要特定于 Kotlin 的解决方案的人。

                      判断一个字符串是否包含数字:

                      val hasDigits = sampleString.any { it.isDigit() }
                      

                      找出字符串是否包含位:

                      val hasOnlyDigits = sampleString.all { it.isDigit() }
                      

                      从字符串中提取数字:

                      val onlyNumberString = sampleString.filter { it.isDigit() }
                      

                      【讨论】:

                        猜你喜欢
                        • 2023-03-19
                        • 1970-01-01
                        • 2019-09-30
                        • 1970-01-01
                        • 2018-10-25
                        • 2019-10-15
                        • 1970-01-01
                        相关资源
                        最近更新 更多