我有一个Java String
对象,需要从中提取数字。举个例子:
"123-456-789"
我想要 "123456789"
是否有一个库函数可以提取数字?
感谢回答。在尝试这些方法之前,我需要知道是否需要安装任何额外的库?
str = str.replaceAll("\\D+","");
这里有一个更冗长的解决方案。不太优雅,但可能更快:
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();
}
测试代码:
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之外还接受很多其他字符。
StringBuilder
不需要重新分配内存,您应该为构造函数提供一个大小(例如input.length()
)。在此处您不需要要求一个String
,CharSequence
足够。另外,您可以通过编写一个接受CharSequence
作为输入和Appendable
实例作为输出累加器的单独函数,将StringBuilder
的分配与非数字的收集分离开来。 - sehpublic 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");
Charmatcher.DIGIT
。 - Duncan McGregorinput.replaceAll("[^0-9?!\\.]","")
这将忽略小数点。
例如:如果您的输入为445.3kg
,则输出将为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。
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
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);
}
我受到了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 );
}
我对非常长的字符串进行了性能测试,结果如下:
不过这也取决于字符串的长度。当字符串只包含6个数字时,Guava慢50%,正则表达式慢1倍。
val digitStr = str.filter { it.isDigit() }
str = str.replaceAll("[^\\.0123456789]","");
。 - Aravindan R(?!\\.)
。 - azerafati