如何从Java中的字符串中正确修剪空格?

时间:2009-09-17 10:22:46

标签: java string unicode

JDK的String.trim()方法非常天真,只删除了ascii控制字符。

Apache Commons'StringUtils.strip()略胜一筹,但使用的是JDK的Character.isWhitespace() doesn't recognize non-breaking space as whitespace

那么在Java中修剪字符串最完整,Unicode兼容,安全且正确的方法是什么?

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

6 个答案:

答案 0 :(得分:58)

Google最近提供了guava-libraries。它may have你在寻找什么:

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

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

例如,它的its own definition of WHITESPACE与JDK不同,并且是根据最新的Unicode标准定义的,因此您需要的内容可以写成:

CharMatcher.WHITESPACE.trimFrom(str)

答案 1 :(得分:7)

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

我还没有尝试过,但据我所知,这完全符合Unicode:

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

答案 2 :(得分:2)

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

但是,如果您真的想要添加更多字符,可以从commons-lang修改strip方法,不仅包括Character.isWhitespace的测试,还包括 { {1}} 似乎是缺少的。即,Character.isSpaceCharstripStart处的以下行分别为:

  • stripEnd
  • while ((start != strLen) && Character.isWhitespace(str.charAt(start)))

答案 3 :(得分:2)

确定白色空间的构成真的很难。有时候我会使用不可破坏的空格来确保它不会被剥离。因此很难找到一个完全符合你想要的库。

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

  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;
  }

答案 4 :(得分:1)

我对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;
    }

答案 5 :(得分:0)

这处理Unicode字符,不需要额外的库:

String trimmed = original.replaceAll ("^\\p{IsWhite_Space}+|\\p{IsWhite_Space}+$", "");

一个小问题是Wikipedia中列出了一些没有Unicode字符属性“ WSpace = Y”的相关空白字符。这些可能不会造成问题,但是您也可以轻松地将它们添加到角色类中。

使用almson-regex的正则表达式如下:

String trimmed = original.replaceAll (either (START_BOUNDARY + oneOrMore (WHITESPACE), oneOrMore (WHITESPACE) + END BOUNDARY), "");

,并包含与非Unicode空白更相关的内容。