JDK的String.trim()方法非常天真,只删除了ascii控制字符。
Apache Commons'StringUtils.strip()略胜一筹,但使用的是JDK的Character.isWhitespace() doesn't recognize non-breaking space as whitespace。
那么在Java中修剪字符串最完整,Unicode兼容,安全且正确的方法是什么?
顺便说一句,是否有一个比commons-lang
更好的图书馆,我应该用这种东西?
答案 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.isSpaceChar
和stripStart
处的以下行分别为:
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空白更相关的内容。