如何正确地修剪Java中的string的空格?

JDK的String.trim()方法非常幼稚,只能删除ascii控制字符。

Apache Commons的StringUtils.strip()稍微好一些,但是使用了JDK的Character.isWhitespace() ,它不会将非空白区域识别为空格 。

那么在Java中修饰string的最完整的,与Unicode兼容的,安全的和正确的方法是什么呢?

顺便说一句,有一个更好的图书馆比commons-lang ,我应该用这种东西?

谷歌最近已经提供了番石榴图书馆 。 它可能有你在找什么:

 CharMatcher.inRange('\0', ' ').trimFrom(str) 

等同于String.trim(),但您可以自定义要修剪的内容,请参阅JavaDoc。

例如,它有自己的WHITESPACE定义,它不同于JDK,并且是根据最新的Unicode标准定义的,所以你需要写成:

 CharMatcher.WHITESPACE.trimFrom(str) 

我发誓,我只是在发布这个问题后才看到这个问题:Google刚刚发布了核心Java实用程序库Guava 。

我还没有尝试过,但从我可以告诉,这是完全符合Unicode:

 String s = " \t testing \u00a0" s = CharMatcher.WHITESPACE.trimFrom(s); 

我总是发现trim几乎适用于所有情况。

但是,如果你真的想包含更多的字符,你可以编辑从commons-langstrip方法,不仅包括Character.isWhitespace的testing,还包括Character.isSpaceChar ,这似乎是缺less的。 也就是说,在stripStartstripEnd分别是下面几行:

  • while ((start != strLen) && Character.isWhitespace(str.charAt(start)))
  • while ((end != 0) && Character.isWhitespace(str.charAt(end - 1)))

确定什么是白色空间真的很难定义。 有时我使用不可破坏的空间来确保它不被剥离。 所以很难find一个图书馆做你想要的东西。

如果我想修剪每个空白,我使用我自己的修剪()。 这是我用来检查空格的函数,

  public static boolean isWhitespace (int ch) { if (ch == ' ' || (ch >= 0x9 && ch <= 0xD)) return true; if (ch < 0x85) // short-circuit optimization. return false; if (ch == 0x85 || ch == 0xA0 || ch == 0x1680 || ch == 0x180E) return true; if (ch < 0x2000 || ch > 0x3000) return false; return ch <= 0x200A || ch == 0x2028 || ch == 0x2029 || ch == 0x202F || ch == 0x205F || ch == 0x3000; } 

我在java的trim()方法上做了一点改动,它支持非ASCII字符。这个方法比大多数的实现运行得更快。

 public static String trimAdvanced(String value) { Objects.requireNonNull(value); int strLength = value.length(); int len = value.length(); int st = 0; char[] val = value.toCharArray(); if (strLength == 0) { return ""; } while ((st < len) && (val[st] <= ' ') || (val[st] == '\u00A0')) { st++; if (st == strLength) { break; } } while ((st < len) && (val[len - 1] <= ' ') || (val[len - 1] == '\u00A0')) { len--; if (len == 0) { break; } } return (st > len) ? "" : ((st > 0) || (len < strLength)) ? value.substring(st, len) : value; }