답변:
정규식을 사용하고 숫자가 아닌 숫자를 삭제할 수 있습니다.
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
BTW : 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 );
}
최소한의 숫자로 매우 긴 문자열에 성능 테스트 를 수행 하고 결과는 다음과 같습니다.
Btw는 해당 문자열의 길이에 따라 다릅니다. 6 개의 숫자 만 포함하는 문자열은 구아바가 50 % 느리고 정규 표현식이 1 배 느립니다.
당신이 사용할 수있는 str.replaceAll("[^0-9]", "");
전화 번호 +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 );
}
암호:
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);
}
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) ;
}
}
}
}
}