【问题标题】:Extract digits from string - StringUtils Java从字符串中提取数字 - StringUtils Java
【发布时间】:2013-02-20 06:59:07
【问题描述】:

我有一个字符串,我想提取字符串中的(唯一)数字序列。

示例: 你好这是A1234样品。 我想要 1234

假定数字序列在字符串中只出现一次,但不在同一位置。

(对于那些会问的人,我有一个服务器名称,需要在其中提取一个特定的数字)

我想使用来自 Apache commomns 的 StringUtils 类。

谢谢!

【问题讨论】:

  • Apache StringUtils。不知道你为什么要使用它。
  • 这就是我所拥有的,想知道是否有一个功能已经在做我需要的事情,但我不太熟悉它
  • 因为,当您可以使用 String 本身进行操作时,您将不需要来自 Apache 的 StringUtils

标签: java string apache-stringutils string-utils


【解决方案1】:

使用此代码 numberOnly 将包含您想要的输出。

   String str="sdfvsdf68fsdfsf8999fsdf09";
   String numberOnly= str.replaceAll("[^0-9]", "");

【讨论】:

  • String.replaceAll() 将在每次运行时编译该模式。真的很不理想。检查它的来源。如下所示,使用 Guava 的 CharMathcer.DIGIT.retainFrom()。
【解决方案2】:

对于这类问题,我总是喜欢使用Guava String utils 或类似名称:

String theDigits = CharMatcher.inRange('0', '9').retainFrom("abc12 3def"); // 123

【讨论】:

  • 这比正则表达式快很多。这应该是公认的答案。
  • 使用 CharMatcher.digit().retainFrom("xx123xx");相反,DIGIT 计划于 2018 年 6 月移除。
  • CharMather.digit() 也已弃用。我用CharMatcher.inRange('0', '9').retainFrom("xx123xx");
【解决方案3】:

只有一行:

int value = Integer.parseInt(string.replaceAll("[^0-9]", ""));

【讨论】:

    【解决方案4】:

    你也可以使用java.util.Scanner:

    new Scanner(str).useDelimiter("[^\\d]+").nextInt()

    您可以使用next() 而不是nextInt() 来获取String 形式的数字。请注意,在结果上调用Integer.parseInt 可能是many times faster 而不是调用nextInt()

    您可以在Scanner 上使用hasNextInt() 检查号码是否存在。

    【讨论】:

      【解决方案5】:

      Guava 的CharMatcher 类从String 中提取Integers。

      String text="Hello1010";
      System.out.println(CharMatcher.digit().retainFrom(text));
      

      产量:

      1010
      

      【讨论】:

        【解决方案6】:

        使用[^0-9] 等正则表达式删除所有非数字。

        从那里,只需使用Integer.parseInt(String);

        【讨论】:

        • 听起来很有趣,你能再给我一些代码吗?假设我的字符串变量名为 myString,我将如何使用它? (我只是对 Java 有点陌生...)
        【解决方案7】:

        你可以拆分字符串并与每个字符进行比较

        public static String extractNumberFromString(String source) {
            StringBuilder result = new StringBuilder(100);
            for (char ch : source.toCharArray()) {
                if (ch >= '0' && ch <= '9') {
                    result.append(ch);
                }
            }
        
            return result.toString();
        }
        

        测试代码

            @Test
            public void test_extractNumberFromString() {
            String numberString = NumberUtil.extractNumberFromString("+61 415 987 636");
            assertThat(numberString, equalTo("61415987636"));
        
            numberString = NumberUtil.extractNumberFromString("(02)9295-987-636");
            assertThat(numberString, equalTo("029295987636"));
        
            numberString = NumberUtil.extractNumberFromString("(02)~!@#$%^&*()+_<>?,.:';9295-{}[=]987-636");
            assertThat(numberString, equalTo("029295987636"));
        }
        

        【讨论】:

          【解决方案8】:
                  String line = "This order was32354 placed for QT ! OK?";
                  String regex = "[^\\d]+";
          
                  String[] str = line.split(regex);
          
                  System.out.println(str[1]);
          

          【讨论】:

            【解决方案9】:

            试试这个:

            String s = "helloThisIsA1234Sample";
            s = s.replaceAll("\\D+","");
            

            这意味着:用空字符串替换所有出现的数字字符(0 -9)!

            【讨论】:

            • 如果您能对您的代码的作用添加一点解释,那就太好了。 :)
            【解决方案10】:

            我为同一问题创建了一个 JUnit 测试类(作为附加知识/信息)。希望对您有所帮助。

               public class StringHelper {
                //Separate words from String which has gigits
                    public String drawDigitsFromString(String strValue){
                        String str = strValue.trim();
                        String digits="";
                        for (int i = 0; i < str.length(); i++) {
                            char chrs = str.charAt(i);              
                            if (Character.isDigit(chrs))
                                digits = digits+chrs;
                        }
                        return digits;
                    }
                }
            

            而JUnit测试用例是:

             public class StringHelperTest {
                StringHelper helper;
            
                    @Before
                    public void before(){
                        helper = new StringHelper();
                    }
            
                    @Test
                public void testDrawDigitsFromString(){
                    assertEquals("187111", helper.drawDigitsFromString("TCS187TCS111"));
                }
             }
            

            【讨论】:

              【解决方案11】:

              您可以使用str = str.replaceAll("\\D+","");

              【讨论】:

                【解决方案12】:

                您可以使用以下正则表达式。

                string.split(/ /)[0].replace(/[^\d]/g, '')
                

                【讨论】:

                  【解决方案13】:

                  如果您有符号并且只需要数字,请尝试这种方法:

                      String s  = "@##9823l;Azad9927##$)(^738#";
                      System.out.println(s=s.replaceAll("[^0-9]", ""));
                      StringTokenizer tok = new StringTokenizer(s,"`~!@#$%^&*()-_+=\\.,><?");
                      String s1 = "";
                      while(tok.hasMoreTokens()){
                          s1+= tok.nextToken();
                      }
                      System.out.println(s1);
                  

                  【讨论】:

                  • 现在这是一个缓慢的解决方案,因为 String 是不可变的,并且在每个循环迭代中都会创建 String 的新实例,至少用 StringBuilder 替换。还是写的不好
                  【解决方案14】:
                     `String s="as234dfd423";
                  for(int i=0;i<s.length();i++)
                   {
                      char c=s.charAt(i);``
                      char d=s.charAt(i);
                       if ('a' <= c && c <= 'z')
                           System.out.println("String:-"+c);
                       else  if ('0' <= d && d <= '9')
                             System.out.println("number:-"+d);
                      }
                  

                  输出:-

                  number:-4
                  number:-3
                  number:-4
                  String:-d
                  String:-f
                  String:-d
                  number:-2
                  number:-3
                  

                  【讨论】:

                  • 您的输出似乎与您的测试输入不匹配。
                  【解决方案15】:

                  你可以试试这个:

                    String str="java123java456";
                    String out="";
                    for(int i=0;i<str.length();i++)
                    {
                      int a=str.codePointAt(i);
                       if(a>=49&&a<=57)
                         {
                            out=out+str.charAt(i);
                         }
                     }
                   System.out.println(out);
                  

                  【讨论】:

                  • 点评来源: 您好,请不要只回答源代码。尝试对您的解决方案如何工作提供一个很好的描述。见:How do I write a good answer?。谢谢
                  • 大写字母或其他语言呢?
                  【解决方案16】:

                  用于分隔字符串中数字的简单python代码

                    s="rollnumber99mixedin447"
                    list(filter(lambda c: c >= '0' and c <= '9', [x for x in s]))
                  

                  【讨论】:

                  • 这个问题有明确的 Java 标签
                  【解决方案17】:

                  一个很简单的解决方案,如果用逗号分隔,或者如果不用逗号分隔

                  public static void main(String[] args) {
                  
                      String input = "a,1,b,2,c,3,d,4";
                      input = input.replaceAll(",", "");
                  
                      String alpha ="";
                      String num = "";
                  
                      char[] c_arr = input.toCharArray();
                  
                      for(char c: c_arr) {
                          if(Character.isDigit(c)) {
                              alpha = alpha + c;
                          }
                          else {
                              num = num+c;
                          }
                      }
                  
                      System.out.println("Alphabet: "+ alpha);
                      System.out.println("num: "+ num);
                  
                  }
                  

                  【讨论】:

                    【解决方案18】:

                    扩展查找浮点数的最佳答案

                           String str="2.53GHz";
                           String decimal_values= str.replaceAll("[^0-9\\.]", "");
                           System.out.println(decimal_values);
                    

                    【讨论】:

                      【解决方案19】:

                      如果您有权访问 org.apache.commons.lang3。 你可以使用 StringUtils.getDigits 方法

                      public static void main(String[] args) {
                          String value = "helloThisIsA1234Sample";
                          System.out.println(StringUtils.getDigits(value));
                      }
                      output: 12345
                      

                      【讨论】:

                        猜你喜欢
                        • 2014-03-10
                        • 2018-10-25
                        • 2019-10-15
                        • 1970-01-01
                        • 2020-06-10
                        • 1970-01-01
                        • 1970-01-01
                        • 2012-01-23
                        • 1970-01-01
                        相关资源
                        最近更新 更多