【问题标题】:Java regular expression to match _all_ whitespace charactersJava 正则表达式匹配 _all_ 空白字符
【发布时间】:2010-12-21 19:42:25
【问题描述】:

我在 Java 中寻找一个匹配字符串中所有空白字符的正则表达式。 "\s" 只匹配一些,它不匹配   和类似的非 ascii 空格。我正在寻找一个与 Java 字符串中可能出现的所有(常见)空白字符匹配的正则表达式。

[编辑]

澄清一下:我不是指字符串序列“ ”,我指的是通常由“ ”表示的正弦 unicode 字符 U+00A0,例如在 HTML 中,以及所有其他具有类似空格含义的 unicode 字符,例如“NARROW NO-BREAK SPACE”(U+202F),以 Unicode 3.2 及更高版本编码为 U+2060 的 Word joiner,“ZERO WIDTH NO-BREAK SPACE”(U+FEFF)和任何其他可以视为白色的字符-空间。

[答案]

对于我的目的,即捕获所有空白字符,unicode + 繁体,以下表达式可以完成工作:

[\p{Z}\s]

答案在下面的 cmets 中,但由于它有点隐藏,我在这里重复一遍。

【问题讨论】:

  • 明确地说,您的意思是字面意思   还是它的输出\u00A0?这有很大的不同。
  •   的输出?通过什么输出?
  • @Vinko:以网络浏览器为例。

标签: java regex


【解决方案1】:

 就正则表达式而言,它不是空格字符。您需要修改正则表达式以包含除 \s 之外的那些字符串,例如 /(\s| |%20)/,或者之前解析字符串内容以获取数据的 ASCII 或 Unicode 表示。

您在这里混合了抽象级别。

如果仔细重新阅读问题后似乎是这种情况,您正在寻找一种方法来匹配所有引用标准 ASCII 的空白字符加上空白代码点,\p{Z}\p{Zs} 将完成这项工作。

你真的应该澄清你的问题,因为它误导了很多人(甚至做出正确的答案来投反对票)。

【讨论】:

  • \p{javaWhitespace} 似乎与 &nbsp (U+00A0) 不匹配。
  • 请改用\p{Z}\p{Zs}。我用 Java 测试过,它们确实匹配 U+00A0。
  • 是也不是,它不在 javadoc 上,但它在 O'Reilly “掌握正则表达式”中:books.google.com.au/…\p{Z}%22&source=bl&ots=QLyHsY8SOl&sig=PaWtJRDUkGIfNh7AALy6OdOwMA0&hl=en&ei= TGIUS6vlCcGIkAXvyOyuAw&sa=X&oi=book_result&ct=result&resnum=1&ved=0CAgQ6AEwAA#v=onepage&q=regular%20expression%20unicode%20whitespace%20%22\p{Z}%22&f=false
  • 不,最好是艾伦将他的评论重新发布为答案。
【解决方案2】:

您按照我预期的方式澄清了问题:您实际上并不是在寻找字符串文字  ,因为这里的许多人似乎认为并且解决方案太明显了。

不幸的是,没有办法使用正则表达式来匹配它们。最好是在模式中包含特定的代码点,例如:"[\\s\\xA0]"

编辑 如其中一个 cmets 所示,您可以为此使用 undocumented "\\p{Z}"。艾伦,你能留下评论你是怎么发现的吗?这个挺好用的。

【讨论】:

  • 它是(许多)标准 Unicode 属性简写之一。它们在 Pattern API 文档中被提及,尽管这个不在示例中。这是一个很好的概述:regular-expressions.info/unicode.html#prop 但它并没有它应有的用途:它不匹配换行符、制表符或(显然)除空格 (U+0020) 之外的任何其他 ASCII 空格。也许这就是你从未听说过它的原因。 :)
  • 感谢您的概述。我真的没想到那些未记录的也可以在 Java 的正则表达式引擎中工作。这意味着 API 文档是不完整的(你知道,我真的不希望 Sun 公司的人这样做)。
  • 很烦\s 不匹配\xA0 -______________________-
【解决方案3】:

  只是 HTML 中的空格。使用HTML parser 提取纯文本。 \s 应该可以正常工作。

【讨论】:

  •   最后生成\u00A0
  • @BalusC:是的,但重要的是,在正则表达式的上下文中“空白字符”的任何合理定义只能包括“最后”产生的 U+00A0,但不能包括文字“ ”。这就是 Vinkos 答案的“你在这里混合抽象级别”的意思(如果我理解正确的话)。
  • @BalusC:不知道 HTLM Parser 做到了。您可以使用\p{Z} 而不是\s 来匹配空格,它将匹配\u00A0
  • @Joachim:是的,“结束”部分也可以产生与 Unicode 代码点不同的东西,这取决于各种因素(主要取决于谁在解释文字  )。
【解决方案4】:

单击here 以查看我对“空白”的几个相互竞争的定义所做的总结。

您最终可能不得不明确列出您关心的与预制件之一不匹配的附加件。

【讨论】:

  • Guava 库将此列表引用为“对‘空白’的几个定义的比较”(source)。但是,凯文,你应该放弃你的消息来源。另外,我想知道“StreamTokenizer;String.trim()”列上的星号有什么用。而且.. 列出的第一个字符是什么.. 什么“(00-08)”?
【解决方案5】:

  不是空格。它是一个字符编码序列,表示 HTML 中的空格。您很可能希望在针对它运行字符串匹配之前将 HTML 编码文本转换为纯文本。如果是这样的话,去看看 javax.swing.text.html

【讨论】:

    【解决方案6】:

    如果有人再次遇到此问题寻求帮助,我建议寻求以下答案:https://stackoverflow.com/a/6255512/1678392

    简短版:\\p{javaSpaceChar}

    为什么:根据Pattern class,这映射了Character.isSpaceChar 方法:

    行为类似于 java.lang.Character boolean ismethodname 方法的类别(不推荐使用的方法除外)可通过相同的 \p{prop} 语法获得,其中指定属性的名称为 javamethodname

    ?

    【讨论】:

      【解决方案7】:

      正则表达式字符是唯一独立于编码的字符。以下是一些字符的列表 - 在 Unicode 中 - 是非打印的:

      How many non-printing characters are in common use?

      【讨论】:

        猜你喜欢
        • 2018-05-03
        • 2017-05-09
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        • 2013-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多