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

标签 java regex whitespace

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

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

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

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

最佳答案

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

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 最终正常运行!

是的,这是可能的,是的,这是一个令人 NumPy 的困惑。这是慈善,甚至。为 Java 获得符合标准的正则表达式库的最简单方法是将 JNI 转换为 ICU 的东西。这就是 Google 为 Android 所做的事情,因为 OraSun 不符合标准。

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

关于java - 空格匹配正则表达式 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4731055/

相关文章:

java - 如何使用Runtime在java中调用python程序

java - SWT模态对话框不是模态的

java正则表达式有时无法匹配

html - 输入代码中的返回行导致输出中元素之间的间隙/空白?

emacs - 如何禁用括号中的Emacs高亮空白?

java - SnakeYAML 转储嵌套键

java - 在构造函数中设置set的内容

java - 读入逗号分隔的文件列表,输出不带逗号而不迭代

node.js - 在只知道链接文本的情况下从 Nodejs 结果获取 URL 的最佳方法

html - 如何给溢出的文本最少 2 行的空间?