\p{InCombiningDiacriticalMarks}
là một thuộc tính khối Unicode. Trong JDK7, bạn sẽ có thể viết nó bằng cách sử dụng ký hiệu hai phần \p{Block=CombiningDiacriticalMarks}
, có thể rõ ràng hơn cho người đọc. Nó được ghi lại ở đây trong UAX # 44: “Cơ sở dữ liệu ký tự Unicode” .
Điều đó có nghĩa là điểm mã nằm trong một phạm vi cụ thể, một khối, đã được cấp phát để sử dụng cho những thứ có tên đó. Đây là một cách tiếp cận không tốt, bởi vì không có gì đảm bảo rằng điểm mã trong phạm vi đó là hoặc không phải là bất kỳ thứ gì cụ thể, cũng như các điểm mã bên ngoài khối đó về cơ bản không phải cùng một ký tự.
Ví dụ, có các chữ cái Latinh trong \p{Latin_1_Supplement}
khối, như é, U + 00E9. Tuy nhiên, có những thứ không phải là chữ cái Latinh ở đó. Và tất nhiên cũng có các chữ cái Latinh ở khắp nơi.
Các khối gần như không bao giờ là những gì bạn muốn.
Trong trường hợp này, tôi nghi ngờ rằng bạn có thể muốn sử dụng tài sản \p{Mn}
, hay còn gọi là \p{Nonspacing_Mark}
. Tất cả các điểm mã trong khối Combine_Diacriticals đều thuộc loại đó. Ngoài ra còn có (kể từ Unicode 6.0.0) 1087 Nonspacing_Marks không nằm trong khối đó.
Điều đó gần giống như kiểm tra \p{Bidi_Class=Nonspacing_Mark}
, nhưng không hoàn toàn, bởi vì nhóm đó cũng bao gồm các dấu bao quanh , \p{Me}
. Nếu bạn muốn cả hai, bạn có thể nói [\p{Mn}\p{Me}]
nếu bạn đang sử dụng một công cụ regex Java mặc định, vì nó chỉ cấp quyền truy cập vào thuộc tính General_Category.
Bạn sẽ phải sử dụng JNI để truy cập thư viện regex ICU C ++ theo cách Google làm để truy cập một cái gì đó tương tự như vậy \p{BC=NSM}
, bởi vì hiện tại chỉ ICU và Perl cấp quyền truy cập vào tất cả các thuộc tính Unicode. Thư viện regex của Java thông thường chỉ hỗ trợ một vài thuộc tính Unicode tiêu chuẩn. Mặc dù vậy, trong JDK7 sẽ có hỗ trợ cho đề xuất Tập lệnh Unicode, điều này rất thích hợp cho thuộc tính Block. Vì vậy, trong JDK7 bạn có thể viết \p{Script=Latin}
hoặc \p{SC=Latin}
, hoặc viết tắt \p{Latin}
, để lấy bất kỳ ký tự nào từ hệ thống chữ Latinh. Điều này dẫn đến rất phổ biến cần thiết [\p{Latin}\p{Common}\p{Inherited}]
.
Hãy lưu ý rằng điều đó sẽ không xóa những gì bạn có thể coi là dấu "trọng âm" khỏi tất cả các ký tự! Có nhiều nó sẽ không làm điều này cho. Ví dụ, bạn không thể chuyển Đ thành D hoặc ø thành o theo cách đó. Vì vậy, bạn cần giảm điểm mã xuống những điểm phù hợp với cùng độ mạnh đối chiếu chính trong Bảng đối chiếu Unicode.
Một nơi khác mà \p{Mn}
điều không thành công tất nhiên là bao gồm các dấu như \p{Me}
, rõ ràng, nhưng cũng có những \p{Diacritic}
ký tự không phải là dấu. Đáng buồn thay, bạn cần hỗ trợ tài sản đầy đủ cho điều đó, có nghĩa là JNI cho ICU hoặc Perl. Tôi e rằng Java có rất nhiều vấn đề với hỗ trợ Unicode.
Chờ đã, tôi thấy bạn là người Bồ Đào Nha. Sau đó, bạn sẽ không gặp vấn đề gì nếu bạn chỉ xử lý văn bản tiếng Bồ Đào Nha.
Tuy nhiên, tôi cá là bạn không thực sự muốn loại bỏ dấu trọng âm, mà là bạn muốn có thể khớp những thứ “thiếu trọng âm”, phải không? Nếu vậy, bạn có thể làm như vậy bằng cách sử dụng lớp đối chiếu ICU4J (ICU cho Java) . Nếu bạn so sánh ở cường độ chính, dấu trọng âm sẽ không được tính. Tôi làm điều này mọi lúc vì tôi thường xử lý văn bản tiếng Tây Ban Nha. Tôi có một ví dụ về cách làm điều này cho người Tây Ban Nha ngồi ở đâu đó ở đây nếu bạn cần.