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

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

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 viMô tảVí dụ
0x00-0x1FControl charactersNUL, LF(\n), CR(\r), TAB(\t)...
0x20Space' '
0x21-0x2FPunctuation/Symbols! " # $ % & ' ( ) * + , - . /
0x30-0x39Digits0-9
0x3A-0x40Punctuation/Symbols: ; < = > ? @
0x41-0x5AUppercase lettersA-Z
0x5B-0x60Symbols[ \ ] ^ _ `
0x61-0x7ALowercase lettersa-z
0x7B-0x7ESymbols{ | } ~
0x7FDEL (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}].*").