【发布时间】:2011-03-07 05:56:31
【问题描述】:
我有一个字符串,我想仅使用 Java 从字符串的最末尾删除行尾字符
"foo\r\nbar\r\nhello\r\nworld\r\n"
我想成为什么样的人
"foo\r\nbar\r\nhello\r\nworld"
(此问题与问题593671相似但不同)
【问题讨论】:
我有一个字符串,我想仅使用 Java 从字符串的最末尾删除行尾字符
"foo\r\nbar\r\nhello\r\nworld\r\n"
我想成为什么样的人
"foo\r\nbar\r\nhello\r\nworld"
(此问题与问题593671相似但不同)
【问题讨论】:
您可以使用s = s.replaceAll("[\r\n]+$", "");。这会修剪字符串末尾的 \r 和 \n 字符
正则表达式解释如下:
[\r\n] 是一个包含 \r 和 \n 的字符类
+ 是一个或多个重复$ 是字符串的结尾锚您还可以使用String.trim() 修剪字符串开头和结尾中的任何个空白字符:
s = s.trim();
如果您需要检查String 是否只包含空白字符,您可以在trim() 之后检查isEmpty():
if (s.trim().isEmpty()) {
//...
}
或者,您还可以查看它是否为matches("\\s*"),即零个或多个空白字符。请注意,在 Java 中,正则表达式 matches 尝试匹配 整个 字符串。在可以匹配子字符串的风味中,您需要锚定模式,因此它是^\s*$。
【讨论】:
trim() 也会删除前导空格,这不是被要求的。
[ab] 与[ba] 相同,是匹配a 或b 的字符类。仅当您定义范围时,顺序才重要,即[0-9],而不是[9-0]。 [ab] 与 ab 不同。
String.trim 不会在这里解决问题吗?
也就是说,你会在你的字符串上调用 .trim() 方法,它应该返回该字符串的副本减去任何前导或尾随空格。
【讨论】:
Apache Commons Lang StringUtils.stripEnd(String str, String stripChars) 可以解决问题;例如
String trimmed = StringUtils.stripEnd(someString, "\n\r");
如果要删除字符串末尾的 all 空格:
String trimmed = StringUtils.stripEnd(someString, null);
【讨论】:
好吧,每个人都给出了一些使用正则表达式的方法,所以我将给出一个最快的方法来代替:
public String replace(String val) {
for (int i=val.length()-1;i>=0;i--) {
char c = val.charAt(i);
if (c != '\n' && c != '\r') {
return val.substring(0, i+1);
}
}
return "";
}
Benchmark 表示它的运行速度比正则表达式解决方案快约 45 倍。
【讨论】:
toCharArray() 可以更快地使用charAt。
如果您的项目中有 Google 的 guava-libraries(如果没有,您可以说应该!),您可以使用 CharMatcher:
String result = CharMatcher.any("\r\n").trimTrailingFrom(input);
【讨论】:
String text = "foo\r\nbar\r\nhello\r\nworld\r\n";
String result = text.replaceAll("[\r\n]+$", "");
【讨论】:
【讨论】: