小编典典

Java空格匹配正则表达式

java

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

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

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

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


阅读 749

收藏
2020-03-16

共2个答案

小编典典

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

String result = matcher.replaceAll(" ");
System.out.println(result);
2020-03-16
小编典典

你不能\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正则表达式。

2020-03-16