Java String
オブジェクトがあります。数字のみを抽出する必要があります。例を挙げましょう:
"123-456-789"
が欲しいです "123456789"
数字のみを抽出するライブラリ関数はありますか?
答えてくれてありがとう。これらを試す前に、追加のライブラリをインストールする必要があるかどうかを知る必要がありますか?
Java String
オブジェクトがあります。数字のみを抽出する必要があります。例を挙げましょう:
"123-456-789"
が欲しいです "123456789"
数字のみを抽出するライブラリ関数はありますか?
答えてくれてありがとう。これらを試す前に、追加のライブラリをインストールする必要があるかどうかを知る必要がありますか?
回答:
正規表現を使用して、数字以外を削除できます。
str = str.replaceAll("\\D+","");
str = str.replaceAll("[^\\.0123456789]","");
(?!\\.)
これは、より詳細なソリューションです。エレガントではありませんが、おそらく高速です:
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
十分です。また、入力としてStringBuilder
aを受け取り、出力アキュムレータとしてインスタンスを受け取る別の関数を記述することにより、非数字のコレクションからの割り当てを分離できます。CharSequence
Appendable
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");
Charmatcher.DIGIT
事前定義されています。
input.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
私はコード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つだけ含まれている場合、グアバは50%遅くなり、正規表現は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 );
}
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) ;
}
}
}
}
}