Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Lớp ký tự POSIX \p{Print} trong Java Regex

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, \x0B và 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

ClassMô tảBao gồm space?
\p{Print}Ký tự in đượcCó
\p{Graph}Ký tự nhìn thấy được (visible)Không
\p{ASCII}Ký tự ASCII (0x00-0x7F)Có (space là 0x20)