Apa cara terbaik untuk mengetahui apakah suatu karakter adalah huruf atau angka di Java tanpa menggunakan regex?

125

Apa cara terbaik dan / atau termudah untuk mengenali jika string.charAt (index) adalah huruf Az atau angka di Java tanpa menggunakan ekspresi reguler? Terima kasih.

Daniel Sopel
sumber

Jawaban:

243

Character.isDigit(string.charAt(index))( JavaDoc ) akan mengembalikan nilai true jika itu adalah digit
Character.isLetter(string.charAt(index))( JavaDoc ) akan mengembalikan nilai true jika berupa huruf

Adam
sumber
13
Catatan: ini memberi tahu Anda jika karakter tersebut adalah huruf / digit Unicode. OP meminta "surat Az" ... apapun artinya.
Stephen C
4
Mengapa ASCII ├ (255) lolos dalam kasus saya? Saya pikir ini hanya untuk az, AZ dan 0-9?
mr5
@ CᴏɴᴏʀO'Bʀɪᴇɴ Link sekarang sudah diperbaiki. Terima kasih telah memberi tahu saya.
Adam
14
Gunakan Character.isLetterOrDigit(string.charAt(index))untuk kedua verifikasi.
Aspirant
Hati-hati, isLetterOrDigit memberikan true lebih dari a-Z0-9 !!! lihat dokumen di sini docs.oracle.com/javase/7/docs/api/java/lang/…
fl0w
24

Saya mencari fungsi yang memeriksa hanya apakah itu salah satu huruf Latin atau angka desimal. Karena char c = 255, yang dalam versi cetak adalah dan dianggap sebagai surat oleh Character.isLetter(c). Fungsi ini menurut saya adalah yang paling dicari oleh sebagian besar pengembang:

private static boolean isLetterOrDigit(char c) {
    return (c >= 'a' && c <= 'z') ||
           (c >= 'A' && c <= 'Z') ||
           (c >= '0' && c <= '9');
}
mr5
sumber
1
Baru saja memeriksa kode kami dan kagum dengan banyaknya bug yang ada di sana karena isLetter dan isLetterOrDigit ... Terima kasih!
fl0w
1
Entah bagaimana Anda mendapatkan kumpulan karakter dan atau tampilan font tercampur. Titik u00ffkode unicode sebenarnya adalah karakter ÿ. (Huruf kecil y dengan umlaut.) Titik kode yang mewakili ├ adalah u251c.
Stephen C
@Fenny kamu benar. Saya lupa bagaimana saya akhirnya mengetik karakter itu alih-alih nbsp
mr5
Di Kotlin jauh lebih sederhanaif (c in 'a'..'z' || с in 'A'..'Z' || c in '0'..'9')
Vlad
23

Seperti yang ditunjukkan oleh jawaban (jika Anda memeriksanya dengan cermat!), Pertanyaan Anda tidak jelas. Apa yang Anda maksud dengan "huruf Az" atau angka?

  • Jika Anda ingin mengetahui apakah suatu karakter adalah huruf atau angka Unicode , gunakan metode Character.isLetterdan Character.isDigit.

  • Jika Anda ingin mengetahui apakah suatu karakter berupa huruf atau angka ASCII , maka hal terbaik yang harus dilakukan adalah mengujinya dengan membandingkan dengan rentang karakter 'a' hingga 'z', 'A' hingga 'Z' dan '0' hingga '9'.

Perhatikan bahwa semua huruf / digit ASCII adalah huruf / digit Unicode ... tetapi ada banyak huruf / digit Unicode karakter yang bukan ASCII. Misalnya, huruf beraksen, cyrillic, sanskrit, ...


Solusi umumnya adalah melakukan ini:

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

dan kemudian uji untuk melihat apakah blok tersebut adalah salah satu blok yang Anda minati. Dalam beberapa kasus, Anda perlu menguji beberapa blok. Misalnya, ada (setidaknya) 4 blok kode untuk karakter Sirilik dan 7 untuk Latin. The Character.UnicodeBlockkelas mendefinisikan konstanta statis untuk blok terkenal; lihat javadocs .

Perhatikan bahwa setiap titik kode akan berada di paling satu blok.

Stephen C
sumber
8

Saya tidak tahu tentang yang terbaik, tetapi ini tampaknya cukup sederhana bagi saya:

Character.isDigit(str.charAt(index))
Character.isLetter(str.charAt(index))
Cameron
sumber
Hati-hati, isLetterOrDigit memberikan true lebih dari a-Z0-9 !!! lihat dokumen di sini docs.oracle.com/javase/7/docs/api/java/lang/…
fl0w
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'))
    // ...

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

vadasambar.dll
sumber
1
Kode sebelumnya salah karena hanya berfungsi dengan bahasa Inggris dan beberapa bahasa lainnya. Untuk menginternasionalkan contoh sebelumnya, gantilah dengan pernyataan berikut: char ch; // ... // Kode ini OK! if (Character.isLetter (ch)) // ... if (Character.isDigit (ch)) // ... if (Character.isSpaceChar (ch)) // ...
Yao Li
OP bertanya dengan jelas if a string.charAt(index) is an A-z letter. Jadi kita tidak sedang membicarakan bahasa lain kan?
vadasambar
Misalnya, dalam bahasa Jerman, ä dapat dianggap dalam kisaran az.
Robert
4

Bandingkan nilainya. Ini harus berada di antara nilai 'a' dan 'z', 'A' dan 'Z', '0' dan '9'

YuppieNetworking
sumber
1
Pendekatan manual ini lebih baik daripada metode built-in Character.isLetter()?
IgorGanapolsky
1
@IgorGanapolsky - Itu tergantung persis apa yang Anda coba lakukan. Petunjuk: mereka melakukan hal yang berbeda!
Stephen C
@StephenC saya pikir Character.isLetter()belum sempurna. Kecuali jika kita berbicara tentang internasionalisasi?
IgorGanapolsky
1
@IgorGanapolsky - Baca javadocs. Kemudian periksa spesifikasi Unicode untuk poin kode apa yang sebenarnya dimiliki kelas karakter masing-masing. >> Tentu saja << kita berbicara tentang internasionalisasi. Karakter di Java semuanya berbasis Unicode.
Stephen C
bagaimana kamu melakukan ini?
john ktejik
3

Gunakan kode di bawah ini

Character.isLetterOrDigit(string.charAt(index))

Ram Repaka
sumber
1
Apa jawaban Anda menambahkan yang belum tercakup dalam jawaban sebelumnya?
Robert
Hati-hati, isLetterOrDigit memberikan true lebih dari a-Z0-9 !!! lihat dokumen di sini docs.oracle.com/javase/7/docs/api/java/lang/…
fl0w
Robert, alih-alih memanggil dua fungsi, Anda tentu saja bisa memanggil satu fungsi.
syekh
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");


}
}
Gowtham Prasath
sumber