如何选择空白模式?

在Oracle Pattern文档中,有三种不同匹配空格的模式的描述:

  1. \ S
  2. \ p {空间}
  3. \ p {javaWhitespace}

我想知道每个人的特殊性以及如何选择合适的人。 我刚刚注意到\p{javaWhitespace}包含更多的空间类型。

我宁愿使用第一个。

  • 它很紧凑
  • 它与许多其他语言以及正则表达式理论中的符号相同
  • \p{javaWhitespace}包括FILE SEPARATORGROUP SEPARATOR等…看到这个 。 在不需要这些时使用它可能会让其他人感到困惑。
  • 一般来说,我希望另一个程序员知道什么是,而我希望他们仔细检查\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 (版本5.1):根据规范(逐字逐句),除了5个常见的,它包括:

    • Unicode类别Zs(分隔符/空格) , \u2028 (行分隔符), \u2029 (段落分隔符)。 它基本上包括Z类(分隔符)下的所有字符。

      实际上\u2028是Zl(分隔符/行)类别的唯一成员, \u2029是Zp类别(分隔符/段落)的唯一成员。 根据措辞,规范的当前版本可能排除对这两个类别的任何进一步扩展。

    • 垂直标签\v
    • Byte-Order Mark又名ZERO WIDTH NO-BREAK SPACE \ufeff
  • Perl ,PCRE(ASCII模式):垂直制表符\v从Perl 5.18添加为实验。 在5.18之前,它只匹配5个常见的。

  • Perl (Unicode模式):除了5个常见的

    • Unicode类别Z(分隔符)
    • 垂直制表符\v从Perl 5.18添加为实验。
    • 下一行(NEL) \u0085
    • 蒙古族鲸鱼分离器 \u180e
  • .NET (默认):除了5个常见的

    • Unicode类别Z(分隔符)
    • 垂直标签\v
    • 下一行(NEL) \u0085
  • Java(Unicode):从Java 7开始,Pattern类包含一个新标志UNICODE_CHARACTER_CLASS ,它使预定义的字符类POSIX字符类符合Unicode技术标准#18:Unicode正则表达式 。 当标志处于活动状态时, 预定义的字符类和相应的POSIX字符类将变为等效(匹配相同的东西)。

    字符列表与.NET相同。

这足以让一个人疯狂!


\p{Space}是更“稳定”的选项,因为它遵循默认模式下的POSIX标准 ,以及UNICODE_CHARACTER_CLASS Unicode技术标准#18:Unicode正则表达式 。

如果使用POSIX字符类,则POSIX兼容的实现在ASCII模式下具有相同的行为,遵循该建议的Unicode正则表达式引擎将在Unicode模式下具有( 几乎 )相同的行为。

\s\p{Space}在Java中是等效的,无论标志如何。 如果您在Java中使用\s ,则可以确定您遵循某些标准/建议。 只是它并没有向大多数程序员宣布这个事实。


\p{isJavaWhitespace}根据Java的定义匹配空格。 该function的名称极具误导性。

除非你有特殊的理由使用其他选项,否则我会保持简单并使用\s