您不能\s
在Java中使用它来匹配其自身的本机字符集上的空格,因为Java不支持Unicode空格属性-即使必须严格遵守Unicode空格才能满足UTS#18的RL1.2! does,它所拥有的并不是符合标准的。
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的模式,至少可以使其符合UTS的RL1.2a的要求。#18,Unicode正则表达式。