Lớp ký tự POSIX \p{ASCII} khớp với các ký tự trong bảng ASCII (0x00 - 0x7F), tức là 128 ký tự đầu tiên của Unicode.
Ví dụ: Đếm ký tự ASCII (code gốc có lỗi logic)
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String args[]) {
System.out.println("Nhập một chuỗi:");
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
// CẢNH BÁO: Regex gốc "^[\\p{ASCII}]" chỉ khớp 1 ký tự đầu nếu là ASCII
// ĐÃ SỬA: Dùng "[\\p{ASCII}]" để đếm TẤT CẢ ký tự ASCII trong chuỗi
String regex = "[\\p{ASCII}]";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
int count = 0;
while (matcher.find()) {
count++;
}
System.out.println("Số ký tự ASCII trong chuỗi: " + count);
}
}
Kết quả mẫu (đã sửa logic)
Nhập một chuỗi: why do we fall Số ký tự ASCII trong chuỗi: 14
Chuỗi "why do we fall" có 14 ký tự ASCII (kể cả 3 khoảng trắng). Code gốc in ra 1 do dùng ^ (anchor đầu chuỗi) và find() chỉ tìm 1 match.
Phân tích lỗi code gốc
- Regex gốc:
"^[\\p{ASCII}]"- chỉ khớp ký tự đầu tiên nếu nó là ASCII. - Phương thức
matcher.find()lặp lại nhưng pattern có anchor^nên chỉ match 1 lần ở đầu chuỗi. - Output gốc "1" là sai so với comment "non-ASCII characters".
Cách dùng đúng
1. Kiểm tra chuỗi CHỈ chứa ASCII
String regex = "^\\p{ASCII}+$";
boolean isPureAscii = input.matches(regex);
2. Đếm ký tự KHÔNG phải ASCII (non-ASCII)
String regex = "[^\\p{ASCII}]"; // Phủ định: KHÔNG phải ASCII
// Hoặc dùng replaceAll để loại bỏ non-ASCII:
String onlyAscii = input.replaceAll("[^\\p{ASCII}]", "");
3. Đếm ký tự ASCII
String regex = "[\\p{ASCII}]"; // Không có ^ $
// Dùng matcher.find() lặp
Bảng mã ASCII (0x00-0x7F)
| Phạm vi | Mô tả | Ví dụ |
|---|---|---|
| 0x00-0x1F | Control characters | NUL, LF(\n), CR(\r), TAB(\t)... |
| 0x20 | Space | ' ' |
| 0x21-0x2F | Punctuation/Symbols | ! " # $ % & ' ( ) * + , - . / |
| 0x30-0x39 | Digits | 0-9 |
| 0x3A-0x40 | Punctuation/Symbols | : ; < = > ? @ |
| 0x41-0x5A | Uppercase letters | A-Z |
| 0x5B-0x60 | Symbols | [ \ ] ^ _ ` |
| 0x61-0x7A | Lowercase letters | a-z |
| 0x7B-0x7E | Symbols | { | } ~ |
| 0x7F | DEL (control) |
Lưu ý
\p{ASCII}bao gồm cả control characters (0x00-0x1F, 0x7F). Nếu chỉ muốn printable ASCII, dùng\p{Print}(nhưng \p{Print} cũng bao gồm space).- Trong Java string:
"\\p{ASCII}". - Kiểm tra file/text có chứa ký tự Unicode ngoài ASCII:
input.matches(".*[^\\p{ASCII}].*").