Ви не можете використовувати \s
в Java для узгодження білого простору на власному наборі символів, тому що Java не підтримує властивість білого простору Unicode - навіть якщо це робити суворо потрібно, щоб відповідати RL1.2 UTS # 18! На жаль, це не відповідає стандартам.
Unicode визначає 26 кодових точок як \p{White_Space}
: 20 з них - це різні види \pZ
GeneralCategory = Separator , а решта 6 - \p{Cc}
GeneralCategory = Control .
Білий простір - досить стабільна властивість, і ті ж самі існували практично назавжди. Тим не менш, у Java немає властивості, яка відповідає стандарту Unicode для них, тож замість цього вам доведеться використовувати такий код:
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 + "]";
Тепер ви можете використовувати whitespace_charclass + "+"
як зразок у своєму replaceAll
.
Вибачте, але все це. Реджекси Java просто не дуже добре працюють на своєму власному наборі символів, і тому вам справді доведеться стрибати через екзотичні обручі, щоб змусити їх працювати.
І якщо ви думаєте, що білий простір поганий, ви повинні побачити, що вам потрібно зробити, щоб отримати, \w
і \b
нарешті поводитись належним чином!
Так, це можливо, і так, це розумний безлад. Це навіть благодійно. Найпростіший спосіб отримати стандартну бібліотеку регулярних виразів для Java - передати JNI на речі ICU. Це те, що Google робить для Android, оскільки OraSun не вимірює.
Якщо ви не хочете цього робити, але все ще хочете дотримуватися Java, у мене є бібліотека переписування регексу передового рівня, я писав, що "виправляє" шаблони Java, принаймні, щоб вони відповідали вимогам RL1.2a в UTS # 18, Регулярні вирази Unicode .