【问题标题】:How to choose between whitespace pattern?如何在空白模式之间进行选择?
【发布时间】:2012-02-15 10:17:30
【问题描述】:

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

  1. \s
  2. \p{空格}
  3. \p{javaWhitespace}

我想知道每种方法的特殊性是什么,以及如何知道如何选择合适的方法。 我刚刚注意到\p{javaWhitespace} 包含更多空间类型。

【问题讨论】:

  • 这取决于你最清楚什么以及你需要什么。您是否需要将“更多空间类型”视为空间?
  • 是的,我想用它来分隔句子中的单词。

标签: java regex


【解决方案1】:

我宁愿使用第一个。

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

【讨论】:

  • 好的,谢谢!在我的情况下,\p{javaWhitespace} 的使用对开发人员来说是透明的,因为我使用java.util.Scanner 来迭代字符串中的单词,它是默认分隔符。所以我想知道我是否应该换成.useDelimiter("\\s+")
【解决方案2】:

\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)的唯一成员,\u2029Zp (Separator/Paragraph)的唯一成员。根据措辞,当前版本的规范可能会排除对这两个类别的任何进一步扩展。

    • 垂直标签\v
    • Byte-Order Mark 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
    • 下一行 (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。当标志处于活动状态时,预定义字符类和对应的POSIX字符类将变得等价(匹配相同的东西)。

    字符列表与 .NET 的相同。

这足以让人抓狂!


\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 匹配空格。该函数的名称极具误导性。

【讨论】:

【解决方案3】:

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

【讨论】:

  • 所以\s 只是写\p{Space} 的一种更简单的方式?
猜你喜欢
  • 2014-11-07
  • 2021-03-31
  • 2021-10-12
  • 2012-02-15
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
  • 2023-03-25
  • 2012-11-27
相关资源
最近更新 更多