从Java中的string中提取数字

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

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

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

感谢您的答案。 在我尝试这些之前,我需要知道是否需要安装任何附加的库?

你可以使用正则expression式并删除非数字。

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

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

 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(); } 

testing代码:

 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); } 

输出:

0123456789

顺便说一句:我没有使用Character.isDigit(CH),因为它接受许多其他字符,除了0 – 9。

 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(); } 

使用Google Guava:

 CharMatcher.inRange('0','9').retainFrom("123-456-789") 

更新:

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

 CharMatcher ASCII_DIGITS=CharMatcher.inRange('0','9').precomputed(); ASCII_DIGITS.retainFrom("123-456-789"); 
 input.replaceAll("[^0-9?!\\.]","") 

这将忽略小数点。

例如:如果你有一个445.3 445.3kg的input,输出将是445.3

使用Google Guava:

 CharMatcher.DIGIT.retainFrom("123-456-789"); 

CharMatcher是可插入的,使用起来非常有趣,例如你可以做到以下几点:

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

输出== 123-456-789

使用正则expression式来匹配您的要求。

 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); } 

我从代码肖恩·帕特里克·弗洛伊德的启发,很less重写它获得最大的性能。

 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 ); } 

我做性能testing很长的string与最小的数字,结果是:

  • 原始代码慢25.5%
  • 番石榴的做法慢2.5-3倍
  • 用D +正则expression式慢3-3.5倍
  • 只有D的正则expression式慢25倍以上

顺便说一句,这取决于该string是多久。 用只包含6个数字的string是番石榴慢50%,正则expression式慢1倍

你可以使用str.replaceAll("[^0-9]", "");

我已经完成了电话号码+9(987)124124的代码。

Unicode字符占用4个字节。

 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 ); int i=0; while ( i< buffer.length() ) { //buffer.hasRemaining() char chr = buffer.get(i); if (chr=='u'){ i=i+5; chr=buffer.get(i); } if ( chr > 39 && chr < 58 ) result[cursor++] = chr; i=i+1; } return new String( result, 0, cursor ); } 

码:

 public class saasa { public static void main(String[] args) { // TODO Auto-generated method stub String t="123-456-789"; t=t.replaceAll("-", ""); System.out.println(t); } 
 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); } } 

输出: 11