空格匹配正则表达式 \- Java

新手上路,请多包涵

用于 正则表达式 的 Java API 声明 \s 将匹配空格。所以正则表达式 \\s\\s 应该匹配两个空格。

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

这样做的目的是用一个空格替换两个连续空格的所有实例。然而,这实际上不起作用。

我对正则表达式或“空白”一词有严重的误解吗?

原文由 user372743 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 964
2 个回答

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

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

原文由 Raph Levien 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

Unicode defines 26 code points as \p{White_Space} : 20 of them are various sorts of \pZ GeneralCategory=Separator , and the remaining 6 are \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 的东西。这就是谷歌为 Android 所做的,因为 OraSun 的不合格。

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

原文由 tchrist 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题