java - 如何在空白模式之间进行选择?

标签 java regex

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

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

我想知道每种方法的特殊性是什么,以及如何知道如何选择正确的方法。 我刚刚注意到 \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 (Edition 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种

    • 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 .当该标志处于 Activity 状态时,预定义字符类 和相应的 POSIX 字符类 将变得等效(匹配相同的东西)。

    字符列表与 .NET 的相同。

这足以让一个人发疯!


\p{Space} 是更“稳定”的选项,因为它遵循 POSIX standard在默认模式下,Unicode Technical Standard #18: Unicode Regular ExpressionUNICODE_CHARACTER_CLASS 中。

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

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


\p{isJavaWhitespace} 根据 Java's definition 匹配空格.该函数的名称极具误导性。

关于java - 如何在空白模式之间进行选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9291474/

相关文章:

java - 在 JSPX 中创建自定义标签

regex - 使用 SED 或 AWK 从文件中删除行

php - 使用 XPATH 删除 <p><strong><br/> </strong></p>

python - 如何在 Django URL 模式中使用小数?

c# - 将增量数字添加到重复字符串

java - 如何将用户重定向到 Cloud Firestore 中的特定 Activity ?

java - Android Canvas 线程变得疯狂

java - Swift:在初始化期间覆盖函数(请参阅我在 Java 示例中的意思)

Java + 脚本引擎 : differences between JSR223 + similar alternatives

regex - 使 htaccess 将所有目录放入单个 get 变量中