Cách 1: Regex \\A\\p{ASCII}*\\z (Ngắn gọn)
\\A: đầu string, \\z: cuối string, \\p{ASCII}: ký tự ASCII (0-127), *: 0 hoặc nhiều lần.
import java.util.Scanner;
public class CheckASCII {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Nhập chuỗi: ");
String input = sc.nextLine();
boolean isASCII = input.matches("\\A\\p{ASCII}*\\z");
if (isASCII) {
System.out.println("String approved - chỉ chứa ASCII");
} else {
System.out.println("Contains non-ASCII values");
}
}
}
Nhập chuỗi: hello how are you String approved - chỉ chứa ASCII Nhập chuỗi: whÿ do we fall Contains non-ASCII values
Cách 2: Kiểm tra từng ký tự (Unicode code point <= 127)
public class CheckASCIIManual {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Nhập chuỗi: ");
String input = sc.nextLine();
boolean isASCII = true;
for (int i = 0; i < input.length(); i++) {
int codePoint = input.codePointAt(i); // Hỗ trợ surrogate pair (emoji, ký tự đặc biệt)
if (codePoint > 127) {
isASCII = false;
break;
}
}
System.out.println(isASCII ? "ASCII only" : "Non-ASCII found");
}
}
So sánh
| Cách | Ưu điểm | Nhược điểm |
|---|---|---|
Regex matches() | Ngắn, dễ đọc, built-in | Tạo Pattern object mỗi lần (chậm nếu lặp nhiều) |
| Duyệt codePoint | Kiểm soát chi tiết, nhanh nếu break sớm | Code dài hơn |
| Pre-compiled Pattern | Hiệu suất cao cho lặp nhiều | Cần cache Pattern object |
Best practice cho high-performance
private static final Pattern ASCII_PATTERN = Pattern.compile("\\A\\p{ASCII}*\\z");
public static boolean isASCII(String s) {
return ASCII_PATTERN.matcher(s).matches();
}
Lưu ý: ASCII = 0-127. Extended ASCII (128-255) KHÔNG phải ASCII chuẩn. Unicode > 127.