Nie można używać \s
w Javie do dopasowywania białych znaków we własnym natywnym zestawie znaków, ponieważ Java nie obsługuje właściwości białych znaków Unicode - nawet jeśli jest to ściśle wymagane, aby spełnić wymagania RL1.2 UTS # 18! Niestety, to nie jest zgodne ze standardami.
Unicode definiuje 26 punktów kodowych jako \p{White_Space}
: 20 z nich to różne rodzaje \pZ
GeneralCategory = Separator , a pozostałe 6 to \p{Cc}
GeneralCategory = Control .
Biała przestrzeń jest dość stabilną właściwością, a te same istnieją praktycznie od zawsze. Mimo to Java nie ma dla nich właściwości zgodnych ze standardem Unicode, więc zamiast tego musisz użyć takiego kodu:
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 + "]";
Teraz możesz użyć whitespace_charclass + "+"
jako wzoru w swoim replaceAll
.
Przepraszam za to wszystko. Wyrażenia regularne Javy po prostu nie działają zbyt dobrze w swoim własnym natywnym zestawie znaków, więc naprawdę musisz przeskakiwać przez egzotyczne obręcze, aby działały.
A jeśli uważasz, biała przestrzeń jest źle, trzeba zobaczyć, co trzeba zrobić, aby dostać się \w
i \b
w końcu zachowywać się poprawnie!
Tak, jest to możliwe i tak, to przytłaczający bałagan. To nawet charytatywność. Najłatwiejszym sposobem uzyskania biblioteki regex zgodnej ze standardami dla Javy jest przejście przez JNI do rzeczy ICU. To właśnie robi Google dla Androida, ponieważ OraSun nie spełnia wymagań.
Jeśli nie chcesz tego robić, ale nadal chcesz pozostać przy Javie, mam bibliotekę do przepisywania wyrażeń regularnych typu front-end, napisałem, że „naprawia” wzorce Javy, przynajmniej po to, aby były zgodne z wymaganiami RL1.2a w UTS # 18, Wyrażenia regularne Unicode .