Tôi tìm thấy một regex thú vị trong một dự án Java: "[\\p{C}&&\\S]"
khống và Java nhân vật regex lớp: p {C}
Tôi hiểu rằng &&
có nghĩa là "thiết lập giao", và \S
là "non-khoảng trắng", nhưng \p{C}
là gì và có thể sử dụng không?
java.util.regex.Pattern documentation không đề cập đến nó. Các chỉ lớp tương tự trên danh sách là \p{Cntrl}
, nhưng họ hành xử khác nhau: cả hai đều trận đấu trên ký tự điều khiển, nhưng \p{C}
phù hợp hai lần trên các ký tự Unicode trên U + FFFF, chẳng hạn như PILE OF POO
:
public class StrangePattern {
public static void main(String[] argv) {
// As far as I can tell, this is the simplest way to create a String
// with code points above U+FFFF.
String poo = new String(Character.toChars(0x1F4A9));
System.out.println(poo); // prints ``
System.out.println(poo.replaceAll("\\p{C}", "?")); // prints `??`
System.out.println(poo.replaceAll("\\p{Cntrl}", "?")); // prints ``
}
}
Việc đề cập đến chỉ Tôi đã tìm thấy ở bất kỳ đâu là here:
\ p {C} hoặc \ p {Other}: các ký tự điều khiển ẩn và các điểm mã không sử dụng.
Tuy nhiên, \p{Other}
dường như không tồn tại trong Java và các điểm mã phù hợp không được sử dụng.
My phiên bản Java thông tin:
$ java -version
java version "1.8.0_92"
Java(TM) SE Runtime Environment (build 1.8.0_92-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.92-b14, mixed mode)
Bonus câu hỏi: mục đích khả năng của mô hình ban đầu, "[\\p{C}&&\\S]"
là gì? Nó xuất hiện trong một phương thức xác nhận một chuỗi trước khi nó được gửi trong một email: nếu mẫu đó được khớp, ngoại lệ với thông báo "Chuỗi không hợp lệ" được nâng lên.
Diễn giải http: // www.unicode.org/reports/tr44/, 'p {C}' có thể là mã kiểm soát, ký tự điều khiển định dạng, điểm mã thay thế, ký tự sử dụng cá nhân, điểm mã không được gán trước hoặc một noncharacter. Đó là vì điều "điểm mã thay thế" (và việc thực hiện một chút của UTF-16 của Java) rằng một đống poo khớp với hai trong số đó. –