目录
写在文章前
需求描述
实现思路
实现的代码
一、仿jdk源码的实现
二、用replaceAll和正则表达式实现
使用过各类数据库管理系统的SQL语句的朋友们对TRIM(),RTRIM(),LTRIM()等函数可能不陌生,在去除多余空格的有关操作中,这类函数应该可以称为是首选了。在java应用程序的开发中,有时也不免需要去除字符串前后的一些字符,所以在java中实现这类函数也有一定的应用空间。由于作者编程水平一般,所以本文仅仅记录作者在实现需求时的一些拙见。
一、输入字符串和需要去除的字符,实现从字符串左侧去除指定的单一字符。
二、输入字符串和需要去除的字符,实现从字符串右侧去除指定的单一字符。
三、输入字符串和需要去除的字符,实现从字符串两侧去除指定的单一字符。
按需求去除指定的字符串,优先考虑使用java.lang.String类中的方法。
首先考虑到replace方法,但replace方法会替换所有字符,需求中只需要去掉两端的字符,所以不考虑用replace实现。再想到substring结合IndexOf、LastIndexOf方法,应该可行,此处需要判断右端最后一次出现字符串的位置的前一位是否是与指定字符不匹配的字符,才能确定substring的位置(确定左端第一次出现)。因此,可以通过逐个比对字符是否是指定字符的方法,来确认开始截取和结束截取的位置,然后调用一次substring方法即可完成字符串的截取,从而得到需要的结果。
作者在写文章前看了jdk中String类的trim()方法。因此,以下是作者在jdk实现trim()的源代码的基础上,稍作修改所写的实现代码。源码的思路与本文的思路相同,所以就采用了源码中的写法。
public class TestTrim {
public static void main(String[] args) {
String content = "012304560";
char matchContent = '0';
System.out.printf("%s after trim %s : %s\n",content,matchContent,trim(content, matchContent));
System.out.printf("%s after right trim %s : %s\n",content,matchContent,rightTrim(content, matchContent));
System.out.printf("%s after left trim %s : %s\n",content,matchContent,leftTrim(content, matchContent));
}
public static String trim(String content, char matchContent) {
char[] value = content.toCharArray();
int len = value.length;
int st = 0;
char[] val = value;
while ((st < len) && (val[st] != matchContent)) {
st++;
}
while ((st < len) && (val[len - 1] != matchContent)) {
len--;
}
return ((st > 0) || (len < value.length)) ? content.substring(st, len) : content;
}
public static String rightTrim(String content, char matchContent) {
char[] value = content.toCharArray();
int len = value.length;
int st = 0;
char[] val = value;
while ((st < len) && (val[len - 1] != matchContent)) {
len--;
}
return ((st > 0) || (len < value.length)) ? content.substring(st, len) : content;
}
public static String leftTrim(String content, char matchContent) {
char[] value = content.toCharArray();
int len = value.length;
int st = 0;
char[] val = value;
while ((st < len) && (val[st] != matchContent)) {
st++;
}
return ((st > 0) || (len < value.length)) ? content.substring(st, len) : content;
}
}
执行输出结果如下:
012304560 after trim 0 : 1230456
012304560 after right trim 0 : 01230456
012304560 after left trim 0 : 12304560
使用"0+$"可以匹配字符串末尾的一个或多个"0",并将其替换为空,可以实现right trim 0的效果。
使用"^0+"可以匹配字符串开头的一个或多个"0",并将其替换为空,可以实现left trim 0的效果。
使用"0+$"|"^0+"可以匹配字符串开头及末尾的一个或多个"0",并将其替换为空,可以实现trim 0的效果。
public class TestTrim1 {
public static void main(String[] args) {
String content = "0001230456000";
char matchContent = '0';
System.out.printf("%s after trim %s : %s\n", content, matchContent, trim(content, matchContent));
System.out.printf("%s after right trim %s : %s\n", content, matchContent, rightTrim(content, matchContent));
System.out.printf("%s after left trim %s : %s\n", content, matchContent, leftTrim(content, matchContent));
}
public static String trim(String content, char matchContent) {
String leftMatch = matchContent + "+$";
String rightMatch = "^" + matchContent + "+";
return content.replaceAll(leftMatch + "|" + rightMatch, "");
}
public static String rightTrim(String content, char matchContent) {
return content.replaceAll(matchContent + "+$", "");
}
public static String leftTrim(String content, char matchContent) {
return content.replaceAll("^" + matchContent + "+", "");
}
}
执行输出结果如下:
0001230456000 after trim 0 : 1230456
0001230456000 after right trim 0 : 0001230456
0001230456000 after left trim 0 : 1230456000
本文使用了两种方法实现了两端去除指定字符串的需求。在字符串中需要去除的字符较少时,使用实现方法一和方法二的效率差距可以忽略不计。在需要去除的字符较多时,方法一的运行效率要大大高于方法二(作者尝试了前后各去除5万个字符,效率可以相差接近1秒)。方法一写起来相对麻烦,方法二相对简单。个人认为可以结合使用场景,灵活选择实现方法。