从String实例中删除WhiteSpace Chars

时间:2011-08-30 07:53:15

标签: java regex string trim

还有另一种方法如何从String

中删除WhiteSpace Char

1)其他我知道

myString.trim()

Pattern.compile("\\s");

2)是否有其他原因(s)搜索/寻找另一种/不同的方法,因为我使用

6 个答案:

答案 0 :(得分:14)

GuavaCharMatcher预配置whitespace()。它也适用于unicode。

样本使用:

System.out.println(CharMatcher.whitespace().removeFrom("H \ne\tl\u200al \to   "));

<强>输出:

  

您好

CharMatcher还有许多其他不错的功能,我最喜欢的一个是collapseFrom()方法,用一个字符代替多个出现:

System.out.println(
    CharMatcher.whitespace().collapseFrom("H \ne\tl\u200al \to   ", '*'));

<强>输出:

  

ħë的O *

答案 1 :(得分:7)

您只需使用myString.replaceAll("\\s", "")即可。但是:

  • 注意关于unicode空格的评论
  • 以上将删除换行符。如果您不想删除换行符,请将其从正则表达式中排除。

答案 2 :(得分:3)

修剪删除ASCII 0和ASCII 32之间的前导和尾随字符。这会删除大多数ASCII空格,但也会删除所有控制字符。它也不会在String中删除它们。

for(int i=Character.MIN_CODE_POINT;i<=Character.MAX_CODE_POINT;i++)
  if(Character.isWhitespace(i))
    System.out.println(i);

打印

9 10 11 12 13 28 29 三十 31 32 5760 6158 8192 8193 8194 8195 8196 8197 8198 8200 8201 8202 8232 8233 8287 12288

答案 3 :(得分:3)

继续寻找不同技术的原因是找到一个能够满足您真正需要的技术。例如,trim()仅从字符串的开头和结尾删除空格。要使用正则表达式获得相同的效果,您必须执行以下操作:

s = s.replaceAll("^\\s+|\\s+$", "");

然后就是要删除哪些字符。在Java 7之前,\s仅匹配ASCII空白字符,即:

"[\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020]"

... while(正如彼得观察到的)trim()简单地删除了代码点32处或之下的所有字符(Unicode表示法中为U+0020)。我怀疑这里的想法是其他角色最不可能出现在字符串中,如果他们这样做,你可能想要摆脱它们。 (无论如何,它对我有用.☺)但这是你应该注意的事情。以下是一些代码,用于演示trim()与正则表达式方法之间的区别:

String s = "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007"
         + "\u0008\u0009\n\u000B\u000C\r\u000E\u000F"
         + "\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017"
         + "\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F"
         + "\u0020\u00A0";
System.out.println(s.length());
System.out.println(s.trim().length());
System.out.println(s.replaceAll("\\s", "").length());

输出:

34
1
28

第二行输出中剩下的一个字符是一个不间断的空格(U+00A0,或“NBSP”)。一旦超出ASCII范围,就会有更多的空白字符,但是你最有可能遇到的是NBSP。 trim()和正则表达式都没有将其删除,但请注意当您将最后一行代码更改为此时会发生什么:

System.out.println(s.replaceAll("(?U)\\s", "").length());

...并在Java 7下运行:

34
1
27

通过添加(?U),我启用了UNICODE_CHARACTER_CLASSES模式,正如@tchrist在评论中提到的那样。 NBSP 是一个空白字符,无论Character.isWhitespace()说什么,但这并不意味着你总是希望将它包含在你的空白匹配中。这就是为什么Guava(由@Sean提到)还包括BREAKING_WHITESPACE CharMatcher。

总而言之,要选择正确的工具来删除空格,您需要确切地知道要删除哪些空白字符,以及要从中删除它们的确切位置。它并不是那么复杂,但它并不像trim()和StringTokenizer这样的遗留工具那么简单。它假装它也是如此。

答案 4 :(得分:1)

我正在将一些代码从C#改为Java - 我需要模拟XmlNode.OuterXml和XmlNode.InnerXml。为此,我使用了Transformer,但是由于某种原因,即使你关闭了缩进,它也无法正确识别某些空格。所以我的另一个选择是使用这两个等效调用中的一个来通过正则表达式对包含回车符,换行符和制表符的字符串进行后处理:

string.replaceAll("[\t\n\b\r\f]+ *", "");   
string.replaceAll("[\\s+ *", "");

这两个都删除字符串和制表符空格中的任何空格。希望它至少有点相关。第二个可能是更好的选择

答案 5 :(得分:0)

String.replace(“”,“”);

(2)也许是为了性能调整,除此之外,我不知道