从Java中的字符串中提取数字

use*_*469 195 java string

我有一个Java String对象.我只需从中提取数字.我举个例子:

"123-456-789" 我想要 "123456789"

是否有只提取数字的库函数?

谢谢你的回答.在我尝试这些之前,我需要知道是否必须安装任何额外的llibraries?

cod*_*ict 517

您可以使用正则表达式并删除非数字.

str = str.replaceAll("\\D+","");
Run Code Online (Sandbox Code Playgroud)

  • 如果您的数字有一个小数点,这不会起作用,它也会删除小数点.`str = str.replaceAll("[^ \\.0123456789]","");` (74认同)
  • 我猜你可以用任何你喜欢的方式投票(没有讽刺意图).但我个人的观点是:当优秀的开发人员(我们在这里有很多人)免费分享他们的一些建议时,我会尊重这一点,而且我只会投票给那些非常糟糕的东西(查看我的个人资料,我目前的情况)比率是14xx而17比率下降.但这是我个人的理念,你可以自由拥有自己的理念. (16认同)
  • 很好的短代码.线性搜索可能会更快,但我认为你的更有意义. (6认同)
  • 虽然正则表达式看起来非常简单和干净,但它会遇到性能问题,并且只应在有一次性条带(如表单提交)的情况下使用.如果您正在处理大量数据,那么这不是可行的方法. (2认同)
  • 如果你需要排除任何东西,比如小数点,`(?!\\.)` (2认同)

Sea*_*oyd 47

这是一个更详细的解决方案.不太优雅,但可能更快:

public static String stripNonDigits(
            final CharSequence input /* inspired by seh's comment */){
    final StringBuilder sb = new StringBuilder(
            input.length() /* also inspired by seh's comment */);
    for(int i = 0; i < input.length(); i++){
        final char c = input.charAt(i);
        if(c > 47 && c < 58){
            sb.append(c);
        }
    }
    return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)

测试代码:

public static void main(final String[] args){
    final String input = "0-123-abc-456-xyz-789";
    final String result = stripNonDigits(input);
    System.out.println(result);
}
Run Code Online (Sandbox Code Playgroud)

输出:

0123456789

顺便说一句:我没有使用Character.isDigit(ch),因为它接受除0 - 9之外的许多其他字符.

  • 你应该为`StringBuilder`构造函数(例如`input.length()`)提供一个大小,以确保它不需要重新分配.你不需要在这里要求`String`; `CharSequence`就够了.此外,您可以通过编写一个单独的函数来分离`StringBuilder`与非数字集合的分配,该函数接受`CharSequence`作为输入,并将`Appendable`实例作为输出累加器. (4认同)
  • @RedYeti让这个答案保持不变并添加评论更加光荣,因为Sean接受了赞成票.如果你赶时间的话,那么批评别人的代码也要快得多.不要因为做出有价值的贡献而惩罚他,他不必添加那些有用的花絮,而你的反应使他下次不太可能这样做. (3认同)
  • 我不是在"惩罚"任何人 - 这完全是对我对@seh说的话的误解.我的观点是,他的评论增加了很多,这是值得的,事实上已经发生了很大变化,我觉得有必要回答一下这个问题.我相信肖恩·帕特里克·弗洛伊德并不关心只有帮助别人的荣誉,并且对于提供自己的答案而非常满意.我只是鼓励他,因为我觉得他的贡献值得更高的知名度.怎么可能阅读我的评论,因为其他任何事情都让我感到困惑,但如果它以某种方式表达,我会道歉. (2认同)

dog*_*ane 21

public String extractDigits(String src) {
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < src.length(); i++) {
        char c = src.charAt(i);
        if (Character.isDigit(c)) {
            builder.append(c);
        }
    }
    return builder.toString();
}
Run Code Online (Sandbox Code Playgroud)


Emi*_*mil 20

使用Google Guava:

CharMatcher.inRange('0','9').retainFrom("123-456-789")
Run Code Online (Sandbox Code Playgroud)

更新:

使用预计算CharMatcher可以进一步提高性能

CharMatcher ASCII_DIGITS=CharMatcher.inRange('0','9').precomputed();  
ASCII_DIGITS.retainFrom("123-456-789");
Run Code Online (Sandbox Code Playgroud)

  • 现在有'Charmatcher.DIGIT`预定义. (3认同)

小智 15

input.replaceAll("[^0-9?!\\.]","")
Run Code Online (Sandbox Code Playgroud)

这将忽略小数点.

例如:如果你有一个输入的445.3kg输出会445.3.


Bjo*_*rnS 11

使用Google Guava:

CharMatcher.DIGIT.retainFrom("123-456-789");
Run Code Online (Sandbox Code Playgroud)

CharMatcher是可插拔的,使用起来非常有趣,例如,您可以执行以下操作:

String input = "My phone number is 123-456-789!";
String output = CharMatcher.is('-').or(CharMatcher.DIGIT).retainFrom(input);
Run Code Online (Sandbox Code Playgroud)

输出== 123-456-789


Rag*_*dan 6

使用正则表达式来满足您的要求.

String num,num1,num2;
String str = "123-456-789";
String regex ="(\\d+)";
Matcher matcher = Pattern.compile( regex ).matcher( str);
while (matcher.find( ))
{
num = matcher.group();     
System.out.print(num);                 
}
Run Code Online (Sandbox Code Playgroud)


Per*_*los 5

我受到代码肖恩·帕特里克·弗洛伊德(Sean Patrick Floyd)的启发,几乎没有重写它,以获取最佳性能。

public static String stripNonDigitsV2( CharSequence input ) {
    if (input == null)
        return null;
    if ( input.length() == 0 )
        return "";

    char[] result = new char[input.length()];
    int cursor = 0;
    CharBuffer buffer = CharBuffer.wrap( input );

    while ( buffer.hasRemaining() ) {
        char chr = buffer.get();
        if ( chr > 47 && chr < 58 )
            result[cursor++] = chr;
    }

    return new String( result, 0, cursor );
}
Run Code Online (Sandbox Code Playgroud)

我用最少的数字对非常长的字符串进行性能测试,结果是:

  • 原始代码慢25.5%
  • 番石榴方法慢2.5到3倍
  • 带D +的正则表达式慢3-3.5倍
  • 仅D的正则表达式慢25倍以上

顺便说一句,这取决于该字符串有多长。对于仅包含6个数字的字符串,番石榴慢50%,正则表达式慢1倍


小智 5

public class FindDigitFromString 
{

    public static void main(String[] args) 
    {
        String s="  Hi How Are You 11  ";        
        String s1=s.replaceAll("[^0-9]+", "");
        //*replacing all the value of string except digit by using "[^0-9]+" regex.*
       System.out.println(s1);          
   }
}
Run Code Online (Sandbox Code Playgroud)

输出: 11


Joe*_*röm 5

使用 Kotlin 和 Lambda 表达式,您可以这样做:

val digitStr = str.filter { it.isDigit() }
Run Code Online (Sandbox Code Playgroud)