java 中 rtrim 与 StringBuilder 的等价物
Equivalent of rtrim with StringBuilder in java
我正在尝试从右侧 trim StringBuilder
,像这样:
private StringBuilder rtrim(StringBuilder str, Character trimStr) {
if (str.charAt(str.length() - 1) == trimStr) {
return str.deleteCharAt(str.length() - 1);
}
return str;
}
上述函数可以很好地处理 trimStr 字符,但我想将 trimStr 作为字符串传递。是否有相同的库(类似于 StringUtils)?
您可以像这样使用 replaceAll 或只使用 replaceFirst 和正则表达式:
String str = " some string ";
str = str.replaceAll("\s*$", "");//output is " some string"
编辑
如果您使用的是 StringBuilder,您可以使用:
private static StringBuilder rtrim(StringBuilder str, String trimStr) {
return new StringBuilder(
str.toString().replaceFirst("(" + Pattern.quote(trimStr) + ")+$", "")
);
}
一些输入和输出
" some string " + " " ==> " some string"
" some stringaaa" + "a" ==> " some string"
" some stringabab" + "ab" ==> " some string"
向左 trim (lTrim)
对于左侧 trim,您可以将正则表达式更改为 str.toString().replaceFirst("^(" + Pattern.quote(trimStr) + ")+", "")
private static StringBuilder rtrim(StringBuilder str, String trimStr) {
return new StringBuilder(
str.toString().replaceFirst("^(" + Pattern.quote(trimStr) + ")+", "")
);
}
另一个没有正则表达式的解决方案
右 trim (rTrim)
public StringBuilder rTrim(StringBuilder str, String trimStr) {
if (str != null && trimStr != null) {
int trimLen = trimStr.length();
int strLen = str.length();
if (strLen != 0 && trimLen != 0) {
while (strLen != 0 && str.substring(strLen - trimLen, strLen).equals(trimStr)) {
str = str.delete(strLen - trimLen, strLen);
strLen = str.length();
}
}
}
return str;
}
向左 trim (lTrim)
public StringBuilder lTrim(StringBuilder str, String trimStr) {
if (str != null && trimStr != null) {
int len = trimStr.length();
if (str.length() != 0 && len != 0) {
while (str.length() != 0 && str.substring(0, len).equals(trimStr)) {
str = str.delete(0, len);
}
}
}
return str;
}
类似这样的方法可行:
private StringBuilder rtrim(StringBuilder str, String trimStr) {
if(str.length() == 0 || trimStr.isEmpty()) {
return str;
}
int lastIndexOf = str.lastIndexOf(trimStr);
if(lastIndexOf >= 0 && lastIndexOf + trimStr.length() == str.length()) {
str.setLength(lastIndexOf);
}
return str;
}
这将从提供的 str
末尾删除 trimStr
。
直接在 StringBuilder
上使用 lastIndexOf
可避免将所有内容都转换为字符串。
如果您想删除 str
末尾出现的所有 trimStr
,您可以这样做:
private StringBuilder rtrim(StringBuilder str, String trimStr) {
if(str.length() == 0 || trimStr.isEmpty()) {
return str;
}
int lastIndexOf;
while((lastIndexOf = str.lastIndexOf(trimStr)) >= 0 && lastIndexOf + trimStr.length() == str.length()) {
str.setLength(lastIndexOf);
}
return str;
}
如您所述,您可以使用 Apache StringUtils
库:
private static StringBuilder rTrim(StringBuilder sb, String stripChars) {
return new StringBuilder(StringUtils.stripEnd(sb.toString(), stripChars));
}
private static StringBuilder lTrim(StringBuilder sb, String stripChars) {
return new StringBuilder(StringUtils.stripStart(sb.toString(), stripChars));
}
我正在尝试从右侧 trim StringBuilder
,像这样:
private StringBuilder rtrim(StringBuilder str, Character trimStr) {
if (str.charAt(str.length() - 1) == trimStr) {
return str.deleteCharAt(str.length() - 1);
}
return str;
}
上述函数可以很好地处理 trimStr 字符,但我想将 trimStr 作为字符串传递。是否有相同的库(类似于 StringUtils)?
您可以像这样使用 replaceAll 或只使用 replaceFirst 和正则表达式:
String str = " some string ";
str = str.replaceAll("\s*$", "");//output is " some string"
编辑
如果您使用的是 StringBuilder,您可以使用:
private static StringBuilder rtrim(StringBuilder str, String trimStr) {
return new StringBuilder(
str.toString().replaceFirst("(" + Pattern.quote(trimStr) + ")+$", "")
);
}
一些输入和输出
" some string " + " " ==> " some string"
" some stringaaa" + "a" ==> " some string"
" some stringabab" + "ab" ==> " some string"
向左 trim (lTrim)
对于左侧 trim,您可以将正则表达式更改为 str.toString().replaceFirst("^(" + Pattern.quote(trimStr) + ")+", "")
private static StringBuilder rtrim(StringBuilder str, String trimStr) {
return new StringBuilder(
str.toString().replaceFirst("^(" + Pattern.quote(trimStr) + ")+", "")
);
}
另一个没有正则表达式的解决方案
右 trim (rTrim)
public StringBuilder rTrim(StringBuilder str, String trimStr) {
if (str != null && trimStr != null) {
int trimLen = trimStr.length();
int strLen = str.length();
if (strLen != 0 && trimLen != 0) {
while (strLen != 0 && str.substring(strLen - trimLen, strLen).equals(trimStr)) {
str = str.delete(strLen - trimLen, strLen);
strLen = str.length();
}
}
}
return str;
}
向左 trim (lTrim)
public StringBuilder lTrim(StringBuilder str, String trimStr) {
if (str != null && trimStr != null) {
int len = trimStr.length();
if (str.length() != 0 && len != 0) {
while (str.length() != 0 && str.substring(0, len).equals(trimStr)) {
str = str.delete(0, len);
}
}
}
return str;
}
类似这样的方法可行:
private StringBuilder rtrim(StringBuilder str, String trimStr) {
if(str.length() == 0 || trimStr.isEmpty()) {
return str;
}
int lastIndexOf = str.lastIndexOf(trimStr);
if(lastIndexOf >= 0 && lastIndexOf + trimStr.length() == str.length()) {
str.setLength(lastIndexOf);
}
return str;
}
这将从提供的 str
末尾删除 trimStr
。
直接在 StringBuilder
上使用 lastIndexOf
可避免将所有内容都转换为字符串。
如果您想删除 str
末尾出现的所有 trimStr
,您可以这样做:
private StringBuilder rtrim(StringBuilder str, String trimStr) {
if(str.length() == 0 || trimStr.isEmpty()) {
return str;
}
int lastIndexOf;
while((lastIndexOf = str.lastIndexOf(trimStr)) >= 0 && lastIndexOf + trimStr.length() == str.length()) {
str.setLength(lastIndexOf);
}
return str;
}
如您所述,您可以使用 Apache StringUtils
库:
private static StringBuilder rTrim(StringBuilder sb, String stripChars) {
return new StringBuilder(StringUtils.stripEnd(sb.toString(), stripChars));
}
private static StringBuilder lTrim(StringBuilder sb, String stripChars) {
return new StringBuilder(StringUtils.stripStart(sb.toString(), stripChars));
}