【问题标题】:Removing all whitespace characters except for " "删除除“”之外的所有空白字符
【发布时间】:2011-06-21 16:41:32
【问题描述】:

我认为自己在正则表达式方面做得很好,但这个似乎非常棘手:我想修剪 all 空白,除了空格字符:@987654322 @。

在 Java 中,我尝试过的 RegEx 是:[\s-[ ]],但这个也去掉了' '

更新:

这是我试图从中删除空格的特定字符串:

项目团队管理密钥

注意:它将是“团队”和“管理”之间的字符。它们在编辑这篇文章时显示为一个长空格,但在查看模式下显示为一个空格。

【问题讨论】:

  • 您可以用您知道不会出现的字符替换所有空格,删除所有空格并将特殊字符改回空格。
  • 是的(这个技巧实际上已经发生在我身上),我怀疑它会起作用,但需要三个替换而不是一个。
  • 所以...呃...您希望您的输出字符串读取project teammanage key?
  • 你最好告诉我们它是什么角色。我们只看到很多空间。它可能是任何东西。请注意,Java 中的 \s 并未涵盖所有 Unicode 空间,请参阅下面的评论和 spreadsheets.google.com/pub?key=pd8dAQyHbdewRsnE5x5GzKQ
  • 作为十进制值,32 一个空格(在Unicode和ASCII中);作为十六进制值,它是字符“2”。所以我认为你对团队和管理之间的关系感到困惑。

标签: java regex


【解决方案1】:

尝试使用这个正则表达式:

[^\S ]+

由于双重否定,阅读起来有点混乱。正则表达式 [\S ] 匹配您要保留的字符,即空格或任何不是空格的字符。因此,否定字符类 [^\S ] 必须匹配您要删除的所有字符。

【讨论】:

  • 好主意,但这实际上并没有奏效。这在逻辑上似乎等同于我最初的尝试(使用减法)。我开始认为我需要指定要剥离的范围和/或特定字符,这很不幸。
  • 我应该注意,如果我在 "\s" 上进行全部替换,它会去除所有空格,但也会去除 ' ',这太激进了。
  • 它必须有效....而且确实有效。试试System.out.println("\t aaa \t\n".replaceAll("[^\\S ]", "").getBytes());
  • @Mark Byers 是的,我使用了大写的“S”,并且我知道需要使用双反斜杠。 @maaartinus:我在这里尝试删除的空格不是制表符...老实说,我不确定确切的空格字符是什么,但我确实知道这些不是制表符或新行并且 "\\s" 能够将它们剥离出来。
  • @Ryan Delucchi:您能否将字符串打印到文件中,然后将其复制并粘贴到您的问题中,以便我们可以准确地看到您要删除哪些字符?
【解决方案2】:

使用GuavaCharMatcher

String text = ...
String stripped = CharMatcher.WHITESPACE.and(CharMatcher.isNot(' '))
    .removeFrom(text);

如果您实际上只是希望从字符串的开头和结尾修剪它(例如String.trim()),您可以使用trimFrom 而不是removeFrom

【讨论】:

  • 这里对空格的定义与\s使用的不同。更好(更接近 Unicode 标准)。
【解决方案3】:

Java 中没有字符类的减法,否则你可以使用[\s--[ ]],注意双破折号。您总是可以使用与补码的交集来模拟集合减法,所以

[\s&&[^ ]]

应该可以。从第一个答案来看,并不比[^\S ]+好,但原理不同,两者都知道就好。

【讨论】:

  • 这也不起作用。我很惊讶:在 "\s" 上进行匹配似乎正在删除它。
【解决方案4】:

我用这个解决了:

anyString.replace(/[\f\t\n\v\r]*/g, '');

它只是所有可能的空白字符的集合,不包括空白(实际上 \s 没有空格)。它包括制表符、回车符、换行符、垂直制表符和换页符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-16
    • 2019-07-05
    • 2018-03-04
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 2021-10-15
    相关资源
    最近更新 更多