Java正则表达式匹配所有空格字符

35
我正在寻找一个Java正则表达式,它可以匹配字符串中的所有空白字符。"\s"只能匹配一些空格字符,不能匹配 和类似的非ASCII空格字符。我正在寻找一个正则表达式,它可以匹配Java字符串中出现的所有(常见的)空格字符。
[编辑]
为了澄清:我不是指字符串序列" ",我指的是单个Unicode字符U+00A0,它通常由" "表示,例如在HTML中,以及所有具有类似空格含义的其他Unicode字符,例如"窄间隔不换行空格"(U+202F),Unicode 3.2及以上版本中编码的Word joiner为U+2060,"零宽度不换行空格"(U+FEFF)和任何其他可视为空格的字符。
[答案]
对于我的目的,即捕获所有空格字符,包括Unicode和传统空格字符,以下表达式可以完成任务: [\p{Z}\s] 答案在下面的评论中,但由于有点隐藏,我在这里重复一遍。

2
请明确一下,您是指字面上的   还是它的输出 \u00A0?这两者有很大的区别。 - BalusC
“s的输出?由什么输出?” - Vinko Vrsalovic
1
@Vinko:例如Web浏览器。 - BalusC
7个回答

41

 不属于空格字符,就正则表达式而言。你需要修改正则表达式以包括这些字符串加上 \s,例如 /(\s| |%20)/,或者先解析字符串内容以获取数据的 ASCII 或 Unicode 表示。

你在混淆抽象级别。

如果经过仔细重新阅读问题后,看起来你是想要匹配所有空格字符,包括标准 ASCII 加上空格代码点,则 \p{Z}\p{Zs} 可以完成工作。

你应该真正澄清你的问题,因为它已经误导了很多人(甚至使得正确答案有一些负评)。


12
请使用\p{Z}\p{Zs}代替。我已在Java中进行了测试,它们确实匹配U+00A0。 - Alan Moore
但是...这个没有文档记录?http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html - BalusC
1
一个关于\p{Z}和类似内容的好参考资料在这里:http://www.regular-expressions.info/unicode.html - Mike
@BalusC 实际上它几乎已经有文档了。支持的类别是由字符类指定的Unicode标准版本中的那些。对于1.6来说,版本4.0,第2.4节有一个表格2-2列出了字符类别的指定。Zs被列出,Z没有被列出,但我怀疑Z可能是为了向后兼容以前的Unicode版本而被支持的,但我不会费心去查找Unicode规范的先前版本来检查这一点... :) - Gus
显示剩余3条评论

12

你的问题已经被澄清了:实际上你并不是在寻找许多人都认为太过明显的字符串常量 

很遗憾,没有办法使用正则表达式来匹配这些字符。最好的方法是将特定的码点包含在模式中,例如:"[\\s\\xA0]"

编辑,正如评论中提到的,您可以使用未记录在案的 "\\p{Z}" 来实现这一目的。Alan,请留下您是如何发现这一点的评论? 这个方法非常有用。


3
这是(许多)标准Unicode属性缩写符号之一。它们在Pattern API文档中提到,尽管这个并不在示例之列。这里有一个很好的概述:http://www.regular-expressions.info/unicode.html#prop 但它并不像它可能会有用:它不能匹配换行符、制表符或(显然)除了空格(U+0020)以外的任何其他ASCII空白符。也许这就是为什么你从未听说过它的原因。 :) - Alan Moore
谢谢您的概述。我真的没有想到未记录的内容也可以在Java的正则表达式引擎中工作。这意味着API文档不完整(这真的让我感到意外,您知道的,Sun公司的)。 - BalusC
很烦人,\s 不能匹配 \xA0 -______________________- - ThorSummoner

11
< p > &nbsp; 在HTML中仅表示空格。使用 HTML解析器提取纯文本。\s 应该能够正常工作。


&nbsp; 会在结尾生成 \u00A0 - BalusC
@BalusC:是的,但在正则表达式上下文中,“空格字符”的任何合理定义都只能包括在“结尾”产生的U+00A0,而绝不能包括文字“ ”。这就是Vinkos答案中“您正在混合抽象级别”的含义(如果我理解正确的话)。 - Joachim Sauer
16
@BalusC:不知道HTML解析器可以这样做。你可以使用\p{Z}代替\s来匹配空格,它将匹配\u00A0。 (翻译:@BalusC表示他之前不知道HTML解析器可以做到这一点。建议使用\p{Z}替换\s来匹配空格,\p{Z}可以匹配到\u00A0这个特殊字符。) - Andomar
@Joachim:是的,"at end" 部分也可以根据各种因素(主要取决于谁解释字面  )产生与 Unicode 代码点不同的结果。 - Vinko Vrsalovic

4
如�有人�次�到这个问题寻求帮助,我建议采用以下答案:https://dev59.com/OnNA5IYBdhLWcg3wL6sc#6255512 简而言之:\\p{javaSpaceChar} 为什么呢?根�Pattern类的说�,这将映射到Character.isSpaceChar方法:

�java.lang.Character布尔�ismethodname方法(除了已弃用的方法)相似的类别�通过相�的\p{prop}语法�得,在该语法中指定�性的�称为javamethodname。

�

3

点击这里查看我总结的几个“空白”定义的竞争对手。

您可能最终需要明确列出那些不被预制的定义所匹配的其他定义。


Guava库将此列表称为“几个'空格'定义的比较”([来源](http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/CharMatcher.html#WHITESPACE))。然而,Kevin,你应该放弃你的来源。另外,我想知道列“StreamTokenizer; String.trim()”上的星号是用来干什么的。还有..第一个列出的字符是什么..什么“(00-08)”? - Martin Andersson

2

&nbsp;并不是空格。它是HTML中表示空格的字符编码序列。在运行字符串匹配之前,您最好将HTML编码的文本转换为纯文本。如果是这种情况,请查找javax.swing.text.html。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接