Вы не можете использовать \s
в Java для сопоставления пробелов в собственном наборе символов, потому что Java не поддерживает свойство пробелов Unicode - хотя это строго требуется для соответствия UTS # 18 RL1.2! То, что у него есть, увы, не соответствует стандартам.
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, Регулярные выражения Юникода .