【问题标题】:Why isn't char of type SPACE_SEPARATOR recognized as whitespace?为什么不将 SPACE_SEPARATOR 类型的字符识别为空格?
【发布时间】:2013-06-12 23:20:14
【问题描述】:

我有类似“12 345 678”的字符串,我想删除空格(因为转换为 int)。所以我照常做了:myString.replaceAll("\\s", "");,但真是个惊喜!它什么也没做,空间还在。

当我进一步调查时,我发现这个空格字符的类型是 Character.SPACE_SEPARATOR (Character.getType(myString.charAt(<positionOfSpaceChar>)))。

我不明白为什么这个不经意的空格字符(来自 Unicode 类别 Zs http://www.fileformat.info/info/unicode/category/Zs/list.htm) 被识别为空白(即使是 Character.isWhitespace(char))。

通读 java api 没有帮助(到目前为止)。

注意:最后,我只是想删除那个角色......我可能会找到一种方法来做到这一点,但我真的很想解释为什么它会这样。谢谢

【问题讨论】:

  • 字符串是不可变的。是否将方法的返回值赋给了另一个 String 变量?
  • 是的。问题是,这些空间不仅仅是“普通空间”。它们可能是不间断的空间或类似的东西。我在这里找到了我的问题的解决方案:stackoverflow.com/questions/1060570/…replaceAll(\\p{javaSpaceChar}", "_")) 但我找不到一些令人满意的解释为什么会这样......
  • java.util.regex.Pattern 的 Javadoc 声明 \s 表示 [ \t\n\x0B\f\r]java.lang.Character.isWhitespace 的 Javadoc 声明它不包含不间断空格。

标签: java string unicode character


【解决方案1】:

您的问题是\s 被定义为[ \t\n\x0B\f\r]。您要使用的是\p{javaWhitespace},它定义为java.lang.Character.isWhitespace() 为真的所有字符。

不确定它是否适用于这种情况,但请注意,不间断空格不被视为空白。 Character.SPACE_SEPARATOR 通常是空格,但 '\u00A0'、'\u2007'、'\u202F' 不包括在内,因为它们是不间断的。如果您想包含不间断空格,则除了 \p{javaWhitespace} 之外,还明确包含这 3 个字符。这有点痛苦,但就是这样。

实际上,在您转换为int 的具体情况下,我建议:

myString.replaceAll("\\D", "");,

去掉所有不是数字的东西。

【讨论】:

  • 感谢您的解释。奇怪的是,Character.isWhitespace(char) 返回 false(当我尝试它时),但 \p{javaWhitespace} 在我的情况下表现正确(这是我寻求的解决方案)。但是使用 \D 要好得多。我想知道我怎么会错过如此不经意的解决方案。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-03-01
  • 2015-12-08
  • 2021-07-01
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-25
相关资源
最近更新 更多