У меня есть объект Java String
. Мне нужно извлечь из него только цифры. Я приведу пример:
"123-456-789"
Я хочу "123456789"
Есть ли библиотека, которая извлекает только цифры?
Спасибо за ответы. Прежде чем попробовать, мне нужно знать, нужно ли мне устанавливать какие-либо дополнительные библиотеки?
Ответ 1
Вы можете использовать регулярное выражение и удалять не-цифры.
str = str.replaceAll("\\D+","");
Ответ 2
Здесь более подробное решение. Менее элегантный, но, вероятно, быстрее:
public static String stripNonDigits(
final CharSequence input /* inspired by seh comment */){
final StringBuilder sb = new StringBuilder(
input.length() /* also inspired by seh 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
BTW: я не использовал Character.isDigit(ch), потому что он принимает много других символов, кроме 0 - 9.
Ответ 3
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();
}
Ответ 4
Использование Google Guava:
CharMatcher.inRange('0','9').retainFrom("123-456-789")
UPDATE:
Использование Прекомпьютерный CharMatcher может еще больше повысить производительность
CharMatcher ASCII_DIGITS=CharMatcher.inRange('0','9').precomputed();
ASCII_DIGITS.retainFrom("123-456-789");
Ответ 5
input.replaceAll("[^0-9?!\\.]","")
Это будет игнорировать десятичные точки.
например: если у вас есть вход как 445.3kg
, выход будет 445.3
.
Ответ 6
Использование 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);
output == 123-456-789
Ответ 7
Используйте регулярное выражение для соответствия вашим требованиям.
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);
}
Ответ 8
Я вдохновил код Шона Патрика Флойда и немного переписал его для максимальной производительности, которую я получаю.
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 );
}
i Тест производительности - очень длинный Строка с минимальными номерами и результат:
- Исходный код на 25,5% медленнее
- Подход Guava в 2,5-3 раза медленнее
- Регулярное выражение с D + в 3-3,5 раза медленнее
- Регулярное выражение только с D в 25 + раз медленнее
Btw зависит от того, как долго эта строка. С строкой, содержащей только 6 чисел, guava на 50% медленнее, а регулярное выражение - в 1 раз медленнее
Ответ 9
Вы можете использовать str.replaceAll("[^0-9]", "");
Ответ 10
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
Ответ 11
Я завершил код для телефонных номеров +9 (987) 124124.
Юникодовые символы занимают 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 );
}
Ответ 12
Код:
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);
}
Ответ 13
import java.util.*;
public class FindDigits{
public static void main(String []args){
FindDigits h=new FindDigits();
h.checkStringIsNumerical();
}
void checkStringIsNumerical(){
String h="hello 123 for the rest of the 98475wt355";
for(int i=0;i<h.length();i++) {
if(h.charAt(i)!=' '){
System.out.println("Is this '"+h.charAt(i)+"' is a digit?:"+Character.isDigit(h.charAt(i)));
}
}
}
void checkStringIsNumerical2(){
String h="hello 123 for 2the rest of the 98475wt355";
for(int i=0;i<h.length();i++) {
char chr=h.charAt(i);
if(chr!=' '){
if(Character.isDigit(chr)){
System.out.print(chr) ;
}
}
}
}
}