Lớp ký tự POSIX \p{Print} khớp với tất cả các ký tự có thể in ra (printable characters) - bao gồm chữ, số, dấu câu, ký hiệu và khoảng trắng thông thường. Không khớp các ký tự điều khiển (control characters) như \n, \t, \r...
Ví dụ 1: Đếm ký tự có thể in
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PrintableCharacters {
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();
String regex = "[\\p{Print}]";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
int count = 0;
while (matcher.find()) {
count++;
}
System.out.println("Số ký tự có thể in: " + count);
}
}
Kết quả mẫu 1
Nhập một chuỗi: test Số ký tự có thể in: 4
Kết quả mẫu 2
Nhập một chuỗi: öäüçãà Số ký tự có thể in: 0
Lưu ý: Kết quả 0 có thể do encoding terminal/console không hỗ trợ hiển thị các ký tự Unicode Latin-1 Supplement này, hoặc chúng bị coi là control characters trong bối cảnh chạy.
Ví dụ 2: Lọc chuỗi chỉ chứa ký tự printable
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String args[]) {
// Regex: chuỗi CHỈ chứa ký tự printable (1 hoặc nhiều)
String regex = "^\\p{Print}+$";
Scanner sc = new Scanner(System.in);
System.out.println("Nhập 5 chuỗi:");
String[] input = new String[5];
for (int i = 0; i < 5; i++) {
input[i] = sc.nextLine();
}
Pattern p = Pattern.compile(regex);
System.out.println("Chuỗi chỉ chứa ký tự printable:");
for (int i = 0; i < 5; i++) {
Matcher m = p.matcher(input[i]);
if (m.matches()) {
System.out.println(m.group());
}
}
}
}
Kết quả mẫu
Nhập 5 chuỗi: helloöäüçãà öäüçãà Hello1234 1234 welcome Chuỗi chỉ chứa ký tự printable: Hello1234 1234 welcome
Lưu ý quan trọng
\p{Print}bao gồm: chữ cái, chữ số, dấu câu, ký hiệu, khoảng trắng (space).- Không bao gồm:
\n,\t,\r,\f,\x0Bvà các control characters khác (ASCII 0-31 và 127). - Trong Java string:
"\\p{Print}". - Kết quả ví dụ 2 cho thấy chuỗi chứa ký tự Unicode Latin-1 (
öäüçãÃ) không được coi là printable trong môi trường chạy - điều này phụ thuộc vào locale/encoding của JVM.
So sánh với các class liên quan
| Class | Mô tả | Bao gồm space? |
|---|---|---|
\p{Print} | Ký tự in được | Có |
\p{Graph} | Ký tự nhìn thấy được (visible) | Không |
\p{ASCII} | Ký tự ASCII (0x00-0x7F) | Có (space là 0x20) |