Cách tốt nhất để biết nếu một ký tự là một chữ cái hoặc số trong Java mà không sử dụng biểu thức chính quy là gì?


125

Cách tốt nhất và / hoặc dễ nhất để nhận ra nếu một chuỗi.charAt (chỉ mục) là một chữ cái Az hoặc một số trong Java mà không sử dụng các biểu thức thông thường? Cảm ơn.

Câu trả lời:


241

Character.isDigit(string.charAt(index))( JavaDoc ) sẽ trả về true nếu đó là một chữ số
Character.isLetter(string.charAt(index))( JavaDoc ) sẽ trả về true nếu đó là một chữ cái


13
Lưu ý: những thông báo này cho bạn biết nếu ký tự là một chữ cái / chữ số Unicode. OP đã yêu cầu "một lá thư Az" ... bất kể điều đó có nghĩa là gì.
Stephen C

4
Tại sao ASCII (255) vượt qua trong trường hợp của tôi? Tôi nghĩ rằng nó chỉ dành cho az, AZ và 0-9?
m5

@ CᴏɴᴏʀO'Bʀɪᴇɴ Liên kết hiện đã được sửa. Cảm ơn vì đã cho tôi biết.
Adam

12
Sử dụng Character.isLetterOrDigit(string.charAt(index))cho cả các xác minh.
Aspirant9

Hãy cẩn thận, isLetterOrDigit cung cấp sự thật trên đường nhiều hơn a-Z0-9 !!! tham khảo các doc đây docs.oracle.com/javase/7/docs/api/java/lang/...
fl0w

24

Tôi đang tìm một hàm chỉ kiểm tra nếu đó là một trong các chữ cái Latinh hoặc số thập phân. Kể từ khi char c = 255, mà trong phiên bản in được là và coi như là một lá thư do Character.isLetter(c). Chức năng này tôi nghĩ là những gì hầu hết các nhà phát triển đang tìm kiếm:

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

1
Chỉ cần xem qua mã của chúng tôi và đã ngạc nhiên khi có bao nhiêu lỗi trong đó vì isLetter và isLetterOrDigit ... Cảm ơn bạn!
fl0w

1
Bằng cách nào đó bạn đã có được bộ ký tự của mình và hoặc hiển thị phông chữ lẫn lộn. Mật mã Unicode u00ffthực sự là ký tự. (Chữ thường chữ y có âm sắc.) Mật mã đại diện cho ├ là u251c.
Stephen C

@StephenC bạn nói đúng. Tôi đã quên cách tôi kết thúc việc gõ ký tự đó thay vì nbsp
mr5

Trên Kotlin đơn giản hơn nhiềuif (c in 'a'..'z' || с in 'A'..'Z' || c in '0'..'9')
Vlad

23

Như các câu trả lời chỉ ra (nếu bạn kiểm tra chúng cẩn thận!), Câu hỏi của bạn không rõ ràng. Bạn có ý nghĩa gì bởi "một chữ cái Az" hoặc một chữ số?

  • Nếu bạn muốn biết nếu một ký tự là một chữ cái hoặc chữ số Unicode , thì hãy sử dụng các phương thức Character.isLetterCharacter.isDigit.

  • Nếu bạn muốn biết một ký tự là một chữ cái hoặc chữ số ASCII , thì điều tốt nhất nên làm là kiểm tra bằng cách so sánh với các phạm vi ký tự 'a' đến 'z', 'A' với 'Z' và '0' với '9'.

Lưu ý rằng tất cả các chữ cái / chữ số ASCII là chữ cái / chữ số Unicode ... nhưng có nhiều ký tự chữ cái / chữ số Unicode không phải là ASCII. Ví dụ: các chữ cái có dấu, cyrillic, tiếng Phạn, ...


Giải pháp chung là làm điều này:

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

và sau đó kiểm tra xem khối đó có phải là một trong những khối mà bạn quan tâm không. Trong một số trường hợp, bạn sẽ cần phải kiểm tra nhiều khối. Ví dụ: có (ít nhất) 4 khối mã cho các ký tự Cyrillic và 7 khối cho tiếng Latin. Các Character.UnicodeBlocklớp định nghĩa các hằng số tĩnh cho các khối nổi tiếng; xem javadocs .

Lưu ý rằng bất kỳ điểm mã nào sẽ có nhiều nhất một khối.



8

Tôi không biết về điều tốt nhất, nhưng điều này có vẻ khá đơn giản với tôi:

Character.isDigit(str.charAt(index))
Character.isLetter(str.charAt(index))

Hãy cẩn thận, isLetterOrDigit cung cấp sự thật trên đường nhiều hơn a-Z0-9 !!! tham khảo tài liệu ở đây docs.oracle.com/javase/7/docs/api/java/lang/iêu
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'))
    // ...

Nguồn: https://docs.oracle.com/javase/tutorial/i18n/text/charintro.html


1
Mã trước là sai vì nó chỉ hoạt động với tiếng Anh và một vài ngôn ngữ khác. Để quốc tế hóa ví dụ trước, thay thế nó bằng các tuyên bố sau: char ch; // ... // Mã này là OK! if (Character.isLetter (ch)) // ... if (Character.isDigit (ch)) // ... if (Character.isSpaceChar (ch)) // ...
Yao Li

OP hỏi rõ ràng if a string.charAt(index) is an A-z letter. Vì vậy, chúng ta không nói về các ngôn ngữ khác là chúng ta?
vadasambar

Ví dụ, tiếng Đức, một ä có thể được coi là nằm trong phạm vi az.
Robert

4

So sánh giá trị của nó. Nó phải nằm giữa giá trị của 'a' và 'z', 'A' và 'Z', '0' và '9'


1
Cách tiếp cận thủ công này tốt hơn Character.isLetter()phương pháp tích hợp?
IgorGanapolsky

1
@IgorGanapolsky - Nó phụ thuộc chính xác những gì bạn đang cố gắng làm. Gợi ý: họ làm những việc khác nhau!
Stephen C

@StephenC Tôi nghĩ Character.isLetter()là thô sơ. Trừ khi chúng ta đang nói về quốc tế hóa?
IgorGanapolsky

1
@IgorGanapolsky - Đọc javadocs. Sau đó kiểm tra thông số kỹ thuật Unicode để biết điểm mã nào mà các lớp ký tự tương ứng thực sự chứa. >> Tất nhiên << chúng ta đang nói về quốc tế hóa. Các ký tự trong Java đều dựa trên Unicode.
Stephen C

Làm thế nào để bạn làm điều này?
john ktejik

3

Sử dụng mã dưới đây

Character.isLetterOrDigit(string.charAt(index))


1
Câu trả lời của bạn thêm gì mà không được đề cập trong các câu trả lời trước?
Robert

Hãy cẩn thận, isLetterOrDigit cung cấp sự thật trên đường nhiều hơn a-Z0-9 !!! tham khảo các doc đây docs.oracle.com/javase/7/docs/api/java/lang/...
fl0w

Robert, thay vì gọi hai chức năng, tất nhiên bạn chỉ có thể gọi một chức năng.
sheikh

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");


}
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.