正则表达式不会与[\ r \ n \ t \ f \ s]匹配空格字符

时间:2016-01-10 21:26:45

标签: java regex string newline whitespace

这可能是一个非常简单的修复,但我无法解决这个问题!

我试图在给定以下文本的情况下连续匹配(最多)3个大写单词。

Russell Lake West。比赛应包括所有3个单词。

此正则表达式将匹配前两个单词,但不匹配第三个单词(demo here):

(([A-Z][a-z]+)\s{0,2}([A-Z][a-z]+)?\s{0,2}([A-Z][a-z]+)?)

此正则表达式匹配所有3个单词,但我必须复制/粘贴LakeWest之间的空格才能使其正常工作(demo here) :

(([A-Z][a-z'-]+)\s{0,2}([A-Z][a-z'-]+)? \s{0,2}([A-Z][a-z'-]+)?)

                                       ^ pasted it here

所以我假设这个空格可能不被视为空格,但可能是换行符或类似字符,所以我尝试了这个(demo here)

[\r\n\t\f\s]West

但它在West之前没有识别出任何这些字符,因此没有返回任何结果。

为什么regex101或Java无法识别LakeWest之间的明显空白?什么是处理这个问题的可靠方法?

1 个答案:

答案 0 :(得分:4)

有很多种空间。您在demo中使用的那个是non-breaking一个(在Unicode表中索引为160),它不属于\s(空格字符类),因为它没有&#39} ; t表示我们可以期望将文本拆分为单独部分(如行)的位置 BTW \s已经代表:\r \n \t \f

要匹配它,您可以使用\p{Zs}课程 您还可以将\s\p{Zs}类与[\\p{Zs}\\s]结合使用。