用于正则表达式的Java API 声明\s将匹配空格。因此,正则表达式\\s\\s应匹配两个空格。
\s
\\s\\s
Pattern whitespace = Pattern.compile("\\s\\s"); matcher = whitespace.matcher(modLine); while (matcher.find()) matcher.replaceAll(" ");
这样做的目的是用单个空格替换两个连续空格的所有实例。但是,这实际上不起作用。
我对正则表达式或“空白”一词有严重的误解吗?
是的,你需要获取matcher.replaceAll()的结果:
String result = matcher.replaceAll(" "); System.out.println(result);
你不能\s在Java中使用它来匹配其自身的本机字符集上的空格,因为Java不支持Unicode空格属性-即使必须严格遵守Unicode空格才能满足UTS#18的RL1.2! does,它所拥有的并不是符合标准的。
Unicode将26个代码点定义为\p{White_Space}:其中20个是各种\pZ GeneralCategory = Separator,其余6个是\p{Cc} GeneralCategory = Control。
\p{White_Space}
\pZ
\p{Cc}
空白是一个相当稳定的属性,而这些空白几乎永远存在。即使这样,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。
whitespace_charclass + "+"
replaceAll
对不起,所有这些。Java的正则表达式在它自己的本机字符集上不能很好地工作,因此你真的必须跳过各种特殊的箍圈才能使其正常工作。
如果你觉得白色空间是坏的,你应该看什么,你必须做的就是\w和\b最终检点!
\w
\b
是的,这是可能的,是的,这是一个令人烦恼的混乱。甚至是慈善的。获得适用于Java的符合标准的正则表达式库的最简单方法是将JNI移交给ICU。这就是Google在Android上所做的事情,因为OraSun的表现并不理想。
如果你不想这样做,但仍然想坚持使用Java,那么我有一个前端正则表达式重写库,我写过“修复” Java的模式,至少要使其符合UTS的RL1.2a的要求。#18,Unicode正则表达式。