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.
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
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:
privatestaticboolean isLetterOrDigit(char c){return(c >='a'&& c <='z')||(c >='A'&& c <='Z')||(c >='0'&& c <='9');}
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, ...
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.
// check if ch is a letterif((ch >='a'&& ch <='z')||(ch >='A'&& ch <='Z'))// ...// check if ch is a digitif(ch >='0'&& ch <='9')// ...// check if ch is a whitespaceif((ch ==' ')||(ch =='\n')||(ch =='\t'))// ...
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'
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.
Character.isLetterOrDigit(string.charAt(index))
untuk kedua verifikasi.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 olehCharacter.isLetter(c)
. Fungsi ini menurut saya adalah yang paling dicari oleh sebagian besar pengembang:sumber
u00ff
kode unicode sebenarnya adalah karakter ÿ. (Huruf kecil y dengan umlaut.) Titik kode yang mewakili ├ adalahu251c
.if (c in 'a'..'z' || с in 'A'..'Z' || c in '0'..'9')
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.isLetter
danCharacter.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:
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.UnicodeBlock
kelas mendefinisikan konstanta statis untuk blok terkenal; lihat javadocs .Perhatikan bahwa setiap titik kode akan berada di paling satu blok.
sumber
Kelas Karakter Java memiliki metode isLetterOrDigit sejak versi 1.0.2
sumber
Saya tidak tahu tentang yang terbaik, tetapi ini tampaknya cukup sederhana bagi saya:
sumber
Sumber: https://docs.oracle.com/javase/tutorial/i18n/text/charintro.html
sumber
if a string.charAt(index) is an A-z letter
. Jadi kita tidak sedang membicarakan bahasa lain kan?Bandingkan nilainya. Ini harus berada di antara nilai 'a' dan 'z', 'A' dan 'Z', '0' dan '9'
sumber
Character.isLetter()
?Character.isLetter()
belum sempurna. Kecuali jika kita berbicara tentang internasionalisasi?Gunakan kode di bawah ini
Character.isLetterOrDigit(string.charAt(index))
sumber
sumber