从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