在Oracle Pattern documentation中,有三种不同的匹配空格模式的描述:
我想知道每个人的特殊性以及如何选择合适的人。
我刚刚注意到\p{javaWhitespace}
包含更多空格类型。
答案 0 :(得分:5)
\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(第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个常见的
之外\v
作为实验。\u0085
\u180e
.NET(默认):除了5个常见的
之外\v
\u0085
Java(Unicode):从Java 7开始,Pattern类包含一个新标志UNICODE_CHARACTER_CLASS
,它使预定义字符类和 POSIX字符类符合到Unicode Technical Standard #18: Unicode Regular Expression。当标志处于活动状态时,预定义字符类和相应的 POSIX字符类将变为等效(匹配相同的内容)。
字符列表与.NET&#39>相同。
这足以让一个人疯狂!
\p{Space}
是更稳定的"选项,因为它遵循默认模式下的POSIX standard和UNICODE_CHARACTER_CLASS
中的Unicode Technical Standard #18: Unicode Regular Expression。
如果使用POSIX字符类,则POSIX兼容的实现在ASCII模式下具有相同的行为,遵循该建议的Unicode正则表达式引擎将在Unicode模式下具有(几乎)相同的行为
无论标志如何, \s
和\p{Space}
在Java中都是等效的。如果您在Java中使用\s
,则可以确定您遵循某些标准/建议。只是它并没有向大多数程序员宣布这个事实。
\p{isJavaWhitespace}
根据Java's definition匹配空格。该功能的名称极具误导性。
答案 1 :(得分:4)
我宁愿使用第一个。
\p{javaWhitespace}
包括FILE SEPARATOR
,GROUP SEPARATOR
等...请参阅this。在不需要这些时使用它可能会让其他人感到困惑。\s
是什么,而我希望他们仔细检查\p{javaWhitespace}
的确切定义。您不希望这样,因为它会降低代码清晰度并在调试过程中增加不必要的负担。答案 2 :(得分:0)
除非您有特殊原因要使用其他选项,否则我会保持简单并使用\s