Java'da bir karakterin harf mi yoksa sayı mı olduğunu normal ifadeler kullanmadan anlamanın en iyi yolu nedir?


125

Normal ifadeler kullanmadan bir string.charAt (index) 'in Java'da bir Az harf mi yoksa bir sayı mı olduğunu anlamanın en iyi ve / veya en kolay yolu nedir? Teşekkürler.

Yanıtlar:


243

Character.isDigit(string.charAt(index))( JavaDoc ) bir rakamsa doğru döndürür
Character.isLetter(string.charAt(index))( JavaDoc ) bir harf ise true döndürür


13
Not: bunlar size karakterin Unicode harf / rakam olup olmadığını söyler. OP "bir Az harfi" istedi ... ne anlama geliyorsa.
Stephen C

4
ASCII ├ (255) benim durumumda neden geçiyor? Bunun sadece az, AZ ve 0-9 için olduğunu düşündüm.
mr5

@ CᴏɴᴏʀO'Bʀɪᴇɴ Bağlantıları düzeltildi. Bilmeme izin verdiğin için teşekkürler.
Adam

14
Character.isLetterOrDigit(string.charAt(index))Her iki doğrulama için de kullanın .
Aspirant9

Dikkatli olun, isLetterOrDigit, a-Z0-9'dan daha fazla doğru verir !!! buradaki dokümana bakın docs.oracle.com/javase/7/docs/api/java/lang/…
fl0w

24

Yalnızca Latin harflerinden biri mi yoksa ondalık sayı mı olduğunu kontrol eden bir işlev arıyorum. Yana char c = 255yazdırılabilir versiyonu olan ve bir mektup olarak kabul Character.isLetter(c). Bence çoğu geliştiricinin aradığı bu işlev:

private static boolean isLetterOrDigit(char c) {
    return (c >= 'a' && c <= 'z') ||
           (c >= 'A' && c <= 'Z') ||
           (c >= '0' && c <= '9');
}

1
Kodumuzu gözden geçirdim ve isLetter ve isLetterOrDigit nedeniyle orada kaç tane hata olduğuna şaşırdım ... Teşekkürler!
fl0w

1
Bir şekilde karakter kümelerinizi veya ekran yazı tiplerini karıştırdınız. Unicode kod u00ffnoktası aslında ÿ karakteridir. (Küçük harfli y ve iki nokta.) ├'yi temsil eden kod noktası u251c.
Stephen C

@StephenC haklısın. Bu karakteri nbsp yerine nasıl yazdığımı unuttum
mr5

Kotlin'de bu çok daha basitif (c in 'a'..'z' || с in 'A'..'Z' || c in '0'..'9')
Vlad

23

Cevapların da gösterdiği gibi (eğer dikkatlice incelerseniz!), Sorunuz belirsizdir. "Az harf" veya rakamla ne demek istiyorsun?

  • Bir karakterin Unicode harf mi yoksa rakam mı olduğunu bilmek istiyorsanız , Character.isLetterve Character.isDigityöntemlerini kullanın .

  • Bir karakterin ASCII harf mi yoksa rakam mı olduğunu bilmek istiyorsanız , yapılacak en iyi şey, 'a' - 'z', 'A' - 'Z' ve '0' karakter aralıklarını karşılaştırarak test etmektir. '9'.

Tüm ASCII harflerinin / rakamlarının Unicode harfler / rakamlar olduğunu unutmayın ... ancak ASCII olmayan birçok Unicode harf / rakam karakteri vardır. Örneğin, aksanlı harfler, kiril, sanskritçe, ...


Genel çözüm, bunu yapmaktır:

Character.UnicodeBlock block = Character.UnicodeBlock.of(someCodePoint);

ve sonra bloğun ilgilendiğiniz bloklardan biri olup olmadığını test edin. Bazı durumlarda birden fazla bloğu test etmeniz gerekecektir. Örneğin, Kiril karakterleri için (en az) 4 kod bloğu ve Latin için 7 kod bloğu vardır. Character.UnicodeBlockSınıf iyi bilinen bloklar için statik sabitleri tanımlar; javadocs bakın .

Herhangi bir kod noktasının en fazla bir blokta .




5
// check if ch is a letter
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
    // ...

// check if ch is a digit
if (ch >= '0' && ch <= '9')
    // ...

// check if ch is a whitespace
if ((ch == ' ') || (ch =='\n') || (ch == '\t'))
    // ...

Kaynak: https://docs.oracle.com/javase/tutorial/i18n/text/charintro.html


1
Yukarıdaki kod yanlıştır çünkü yalnızca İngilizce ve diğer birkaç dilde çalışır. Önceki örneği uluslararasılaştırmak için, aşağıdaki ifadelerle değiştirin: char ch; // ... // Bu kod tamam! if (Character.isLetter (ch)) // ... if (Character.isDigit (ch)) // ... if (Character.isSpaceChar (ch)) // ...
Yao Li

OP açıkça sordu if a string.charAt(index) is an A-z letter. Yani diğer dillerden bahsetmiyoruz, değil mi?
vadasambar

Örneğin, Almanca'da bir ä'nın az aralığında olduğu düşünülebilir.
Robert

4

Değerini karşılaştırın. "A" ve "z", "A" ve "Z", "0" ve "9" değerleri arasında olmalıdır


1
Bu manuel yaklaşım yerleşik Character.isLetter()yöntemden daha mı iyi?
IgorGanapolsky

1
@IgorGanapolsky - Tam olarak ne yapmaya çalıştığınıza bağlı. İpucu: Farklı şeyler yaparlar!
Stephen C

@StephenC İlkel olduğunu düşündüm Character.isLetter(). Uluslararasılaşmadan bahsetmiyorsak?
IgorGanapolsky

1
@IgorGanapolsky - Javadocs okuyun. Ardından, ilgili karakter sınıflarının gerçekte içerdiği kod noktaları için Unicode özelliklerini kontrol edin. >> Elbette << uluslararasılaşmadan bahsediyoruz. Java'daki karakterlerin tümü Unicode tabanlıdır.
Stephen C

bunu nasıl yapıyorsun?
john ktejik


0
 import java.util.Scanner;
 public class v{
 public static void main(String args[]){
 Scanner in=new Scanner(System.in);
    String str;
    int l;
    int flag=0;
    System.out.println("Enter the String:");
    str=in.nextLine();
    str=str.toLowerCase();
    str=str.replaceAll("\\s","");
    char[] ch=str.toCharArray();
    l=str.length();
    for(int i=0;i<l;i++){
        if ((ch[i] >= 'a' && ch[i]<= 'z') || (ch[i] >= 'A' && ch[i] <= 'Z')){
        flag=0;
        }
        else

        flag++;
        break;
        } 
if(flag==0)
    System.out.println("Onlt char");


}
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.