在Oracle Pattern documentation有关于匹配空格的三种不同模式的描述:
- \s
- \p{空格}
- \p{javaWhitespace}
我想知道每种方法的特殊性是什么,以及如何知道如何选择正确的方法。
我刚刚注意到 \p{javaWhitespace}
包含更多空间类型。
最佳答案
\s
是指定空格字符 的最短也是最不可移植的选项。虽然很少将 Java 代码移植到其他语言,但更多的是将一种正则表达式引擎的语法知识移植到另一种。有许多正则表达式引擎使用类似 Perl 的语法,因此对类似 \s
的相同语法的解释差异使程序员感到困惑。
除了空格(ASCII 32)、换行(\n
,ASCII 10)、水平制表符(\t
,ASCII 9)、回车(\r
, ASCII 13) 和换页(\f
, ASCII 12),对于什么是空格字符,不同的引擎之间没有达成共识。
Java, POSIX (ASCII):还包括垂直制表符 (ASCII 11)。 Java 在这里似乎遵循 POSIX 标准。
JavaScript (Edition 5.1): 根据规范逐字逐句,除了5个常见的,它包括:
Unicode 类别 Zs (Separator/Space) ,
\u2028
(行分隔符),\u2029
(段落分隔符)。它基本上包括类别 Z(分隔符)下的所有字符。实际上
\u2028
是类别 Zl (Separator/Line) 的唯一成员,\u2029
是类别 Zp (Separator/Paragraph) 的唯一成员.根据措辞,当前版本的规范可能会排除对这两个类别的任何进一步扩展。- 垂直制表符
\v
- 字节顺序标记又名零宽度不间断空间
\ufeff
Perl , PCRE(ASCII 模式):从 Perl 5.18 添加的垂直制表符
\v
作为实验。 5.18之前只匹配常见的5个。Perl (Unicode模式):除了常见的5种
- Unicode 类别 Z(分隔符)
- 从 Perl 5.18 添加的垂直制表符
\v
作为实验。 - 下一行 (NEL)
\u0085
- 蒙古元音分隔符
\u180e
.NET (默认):除了5个常见的
- Unicode 类别 Z(分隔符)
- 垂直制表符
\v
- 下一行 (NEL)
\u0085
Java (Unicode):从 Java 7 开始,Pattern 类包含一个新标志
UNICODE_CHARACTER_CLASS
这使得预定义字符类 和POSIX 字符类 符合Unicode Technical Standard #18: Unicode Regular Expression .当该标志处于 Activity 状态时,预定义字符类 和相应的 POSIX 字符类 将变得等效(匹配相同的东西)。字符列表与 .NET 的相同。
这足以让一个人发疯!
\p{Space}
是更“稳定”的选项,因为它遵循 POSIX standard在默认模式下,Unicode Technical Standard #18: Unicode Regular Expression在 UNICODE_CHARACTER_CLASS
中。
如果您使用 POSIX 字符类,则符合 POSIX 的实现将在 ASCII 模式下具有相同的行为,而遵循建议的 Unicode 正则表达式引擎将在 Unicode 模式下具有(几乎)相同的行为.
\s
和 \p{Space}
在 Java 中是等价的,与标志无关。如果您在 Java 中使用 \s
,您可以确定您遵循了一些标准/建议。只是它没有向大多数程序员宣布这一事实。
\p{isJavaWhitespace}
根据 Java's definition 匹配空格.该函数的名称极具误导性。
关于java - 如何在空白模式之间进行选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9291474/