Bạn không thể sử dụng \s
trong Java để đối sánh khoảng trắng trên bộ ký tự gốc của riêng nó, vì Java không hỗ trợ thuộc tính khoảng trắng Unicode - mặc dù làm như vậy là bắt buộc để đáp ứng RL1.2 của UTS # 18! Những gì nó có không phù hợp với tiêu chuẩn, than ôi.
Unicode định nghĩa 26 điểm mã là \p{White_Space}
: 20 điểm trong số đó là các loại \pZ
GeneralCategory = Separator , và 6 điểm còn lại là \p{Cc}
GeneralCategory = Control .
Khoảng trắng là một thuộc tính khá ổn định và những đặc tính đó đã tồn tại hầu như mãi mãi. Mặc dù vậy, Java không có thuộc tính nào tuân theo Tiêu chuẩn Unicode cho những thứ này, vì vậy bạn phải sử dụng mã như sau:
String whitespace_chars = "" /* dummy empty string for homogeneity */
+ "\\u0009" // CHARACTER TABULATION
+ "\\u000A" // LINE FEED (LF)
+ "\\u000B" // LINE TABULATION
+ "\\u000C" // FORM FEED (FF)
+ "\\u000D" // CARRIAGE RETURN (CR)
+ "\\u0020" // SPACE
+ "\\u0085" // NEXT LINE (NEL)
+ "\\u00A0" // NO-BREAK SPACE
+ "\\u1680" // OGHAM SPACE MARK
+ "\\u180E" // MONGOLIAN VOWEL SEPARATOR
+ "\\u2000" // EN QUAD
+ "\\u2001" // EM QUAD
+ "\\u2002" // EN SPACE
+ "\\u2003" // EM SPACE
+ "\\u2004" // THREE-PER-EM SPACE
+ "\\u2005" // FOUR-PER-EM SPACE
+ "\\u2006" // SIX-PER-EM SPACE
+ "\\u2007" // FIGURE SPACE
+ "\\u2008" // PUNCTUATION SPACE
+ "\\u2009" // THIN SPACE
+ "\\u200A" // HAIR SPACE
+ "\\u2028" // LINE SEPARATOR
+ "\\u2029" // PARAGRAPH SEPARATOR
+ "\\u202F" // NARROW NO-BREAK SPACE
+ "\\u205F" // MEDIUM MATHEMATICAL SPACE
+ "\\u3000" // IDEOGRAPHIC SPACE
;
/* A \s that actually works for Java’s native character set: Unicode */
String whitespace_charclass = "[" + whitespace_chars + "]";
/* A \S that actually works for Java’s native character set: Unicode */
String not_whitespace_charclass = "[^" + whitespace_chars + "]";
Bây giờ bạn có thể sử dụng whitespace_charclass + "+"
làm mẫu trong của bạn replaceAll
.
Xin lỗi 'về tất cả những điều đó. Các regex của Java không hoạt động tốt trên bộ ký tự gốc của chính nó, và vì vậy bạn thực sự phải vượt qua các vòng lặp kỳ lạ để làm cho chúng hoạt động.
Và nếu bạn nghĩ khoảng trắng là xấu, bạn nên xem bạn phải làm gì để có được \w
và \b
cuối cùng là cư xử đúng mực!
Vâng, nó có thể, và vâng, đó là một mớ hỗn độn. Đó là từ thiện, thậm chí. Cách dễ nhất để có được một thư viện regex phù hợp với tiêu chuẩn cho Java là JNI chuyển sang nội dung của ICU. Đó là những gì Google làm cho Android, bởi vì OraSun's không đo lường được.
Nếu bạn không muốn làm điều đó nhưng vẫn muốn gắn bó với Java, tôi có một thư viện viết lại regex front-end tôi đã viết rằng "sửa chữa" các mẫu của Java, ít nhất là để chúng tuân theo các yêu cầu của RL1.2a trong UTS # 18, Biểu thức chính quy Unicode .