如何选择空白模式?

时间:2012-02-15 10:17:30

标签: java regex

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

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

3 个答案:

答案 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类(分隔符)下的所有字符。

      实际上\u2028Zl (Separator/Line)类别的唯一成员,\u2029是类别Zp (Separator/Paragraph)的唯一成员。根据措辞,当前版本的规范可能会排除对这两个类别的任何进一步扩展。

    • 垂直标签\v
    • 字节顺序标记a.k.a. ZERO WIDTH NO-BREAK SPACE \ufeff
  • Perl,PCRE(ASCII模式):从Perl 5.18添加的垂直标签\v作为实验。在5.18之前,它只匹配5个常见的。

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

    之外
    • Unicode类别Z(分隔符)
    • 从Perl 5.18添加的垂直标签\v作为实验。
    • NEXT LINE(NEL)\u0085
    • MONGOLIAN VOWEL SEPARATOR \u180e
  • .NET(默认):除了5个常见的

    之外
    • Unicode类别Z(分隔符)
    • 垂直标签\v
    • NEXT LINE(NEL)\u0085
  • Java(Unicode):从Java 7开始,Pattern类包含一个新标志UNICODE_CHARACTER_CLASS,它使预定义字符类 POSIX字符类符合到Unicode Technical Standard #18: Unicode Regular Expression。当标志处于活动状态时,预定义字符类和相应的 POSIX字符类将变为等效(匹配相同的内容)。

    字符列表与.NET&#39>相同。

这足以让一个人疯狂!


\p{Space}是更稳定的"选项,因为它遵循默认模式下的POSIX standardUNICODE_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)

我宁愿使用第一个。

  • 紧凑
  • 在许多其他语言中,以及在regexp理论中,它都是相同的符号
  • \p{javaWhitespace}包括FILE SEPARATORGROUP SEPARATOR等...请参阅this。在不需要这些时使用它可能会让其他人感到困惑。
  • 一般来说,我希望其他程序员知道\s是什么,而我希望他们仔细检查\p{javaWhitespace}的确切定义。您不希望这样,因为它会降低代码清晰度并在调试过程中增加不必要的负担。

答案 2 :(得分:0)

除非您有特殊原因要使用其他选项,否则我会保持简单并使用\s