空格匹配正则表达式 - Java

2022-08-31 09:19:03

用于正则表达式的 Java API 状态将与空格匹配。因此,正则表达式应匹配两个空格。\s\\s\\s

Pattern whitespace = Pattern.compile("\\s\\s");
matcher = whitespace.matcher(modLine);
while (matcher.find()) matcher.replaceAll(" ");

这样做的目的是将两个连续空格的所有实例替换为单个空格。但是,这实际上并不起作用。

我是否对正则表达式或术语“空格”有严重的误解?


答案 1

在 Java 中,您不能使用空格来匹配其自己的本机字符集上的空格,因为 Java 不支持 Unicode 空格属性 — 即使这样做是满足 UTS#18 的 RL1.2 的严格要求!唉,它所拥有的不符合标准。\s

Unicode将26个码位定义为:其中20个是各种类型的GeneralCategory=Separator,其余6个是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


对不起,这一切。Java的正则表达式在它自己的原生字符集上不能很好地工作,所以你真的必须跳过异国情调的箍才能使它们工作。

如果你认为空白空间不好,你应该看看你必须做些什么才能得到并最终表现得正确!\w\b

是的,这是可能的,是的,这是一个令人费解的混乱。那也是慈善,甚至。获得Java标准兼容正则表达式库的最简单方法是将JNI转移到ICU的东西上。这就是谷歌为Android所做的,因为OraSun的没有达到标准。

如果你不想这样做,但仍然想坚持使用Java,我有一个前端正则表达式重写库,我写了一个“修复”Java的模式,至少要让它们符合UTS#18,Unicode正则表达式中RL1.2a的要求


答案 2

是的,您需要获取以下结果:matcher.replaceAll()

String result = matcher.replaceAll(" ");
System.out.println(result);