如何选择空白模式?

ala*_*inm 5 java regex

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

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

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

UmN*_*obe 5

我宁愿使用第一个。

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


nha*_*tdh 5

\s是指定空格字符的最短也是最不可移植的选项。尽管很少有将Java代码移植到其他语言的方法,但更多的是将一个正则表达式引擎的语法知识移植到另一种。有很多正则表达式引擎使用类似Perl的语法,因此对于相同语法的解释上的差异\s会使程序员感到困惑。

除了空格(ASCII 32),换行符(\n,ASCII 10),水平制表符(\t,ASCII 9),回车符(\r,ASCII 13)和换页符(\fASCII 12)外,不同引擎之间没有共识一个空格字符

  • Java,POSIX(ASCII):还包括垂直制表符(ASCII 11)。Java似乎在这里遵循POSIX标准。

  • JavaScript(5.1版):根据规范(逐字排列),除了5种常见规范外,还包括:

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

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

    • 垂直标签 \v
    • 字节顺序标记又称零宽度无中断空间 \ufeff
  • Perl,PCRE(ASCII模式):\vPerl 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,该标志使Predefined字符类POSIX字符类符合Unicode技术标准#18:Unicode正则表达式。当该标志处于活动状态时,预定义字符类和相应的POSIX字符类将等效(匹配相同的事物)。

    字符列表与.NET相同。

这足以使一个人疯狂!


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

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

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


\p{isJavaWhitespace}根据Java的定义匹配空白。函数的名称极具误导性。