Util之Java字符串截取

本文主要介绍自定义的Java中字符串截取的工具类

背景

最近在做一个文件传输的项目,今天在做从文件管理器获取文件的时候,使用getName()无法获取不带文件类型的文件名,所以需要对文件的名字进行进一步截取。

可是,在做字符串截取的时候,突然发现split方法无法截取”.”。一开始,甚是纳闷为什么打印截取的内容会报错,后来怀疑是不是split无法截取“.”,经过测试发现,果然我的猜想是对的(path.split()得到的数组长度为0),不过遗憾的是,没有去分析源码,所以未能搞懂为什么无法截取“.”。暂时打算抛弃split这个坑了

实践

自定义Util类

/**
 * 
 * @Description:
 * 
 * @author taozhang
 * @created 2016年5月29日 下午8:21:18
 *
 */
    public class SplitStringUtil {

    // private static String stringDemo = "I love tt";
    private static String stringDemo = "Android驱动开发与移植实战详解.pdf.pdf";

    private static List<String> list;

    public static List<String> getArrayBySplit(String string, String regular) {
        list = new ArrayList<String>();
        String[] split = string.split(regular);
        for (String string2 : split) {
            System.out.println(string2);
        }
        return list;
    }

    public static List<String> getArrayByStringTokenizer(String string,
            String regular) {
        list = new ArrayList<String>();
        StringTokenizer token = new StringTokenizer(string, regular);// 按照空格和逗号进行截取
        while (token.hasMoreTokens()) {
            String nextToken = token.nextToken();
            list.add(nextToken);
            System.out.println(nextToken);
        }
        return list;
    }

    public static List<String> getArrayByIndexOf(String string, String regular) {
        list = new ArrayList<String>();

        String temp = string;
        int indexOf = temp.indexOf(regular);// 获取第一个匹配的index
        if (indexOf == -1) {
            System.out.println("未找到匹配的!");
            return null;
        }
        // 第一次从0开始截取,之后从该位置+1开始截取
        String substring = temp.substring(0, indexOf);// 截取从下表0到index
        while (indexOf != -1) {// -1为匹配结束
            System.err.println("temp:" + temp);
            System.err.println("substring:" + substring);// 打印截取的
            System.err.println("indexOf:" + indexOf + "");
            list.add(substring);
            temp = temp.substring(indexOf + 1);// 去除temp的第一段
            indexOf = temp.indexOf(regular);// 再次获取第一个匹配的index
            substring = temp.substring(indexOf + 1);//1.必须+1才能正常截取,2.可以避免是-1
            System.out.println(substring);
        }
        System.err.println("temp:" + temp + ",subString:" + substring
                + ",index:" + indexOf);
        list.add(temp);
        return list;
    }

    public static void main(String[] args) {
        getArrayBySplit(stringDemo, ".");
        getArrayByStringTokenizer(stringDemo, ".");
        getArrayByIndexOf(stringDemo, ".");
    }

}

上测试图

eclipse se这个控制台有点毒,会把err与out分类打印,不像adt是按照顺序打印的,还好我能看懂。大家仔细阅读下逻辑,相信也是没问题的。

需要注意的是,indexOf的截取,第二次开始,index一定要+1之后再截取,否则可能会出现这样的情况

我再稍微解释下第二种情况,为什么会越界呢?当截取最后一段,如“.pdf”时候,我们使用

temp = temp.substring(indexOf + 1);// 去除temp的第一段
indexOf = temp.indexOf(regular);// 再次获取第一个匹配的index
substring = temp.substring(indexOf + 1);

的时候,可以看到此时temp是从indexOf+1开始截取的,所以返回的temp为pdf,然后下一步去匹配“.”,返回的index自然是-1了,之后,咱们再对temp去从-1开始截取,则必然是越界了。就好像是一开始的截取,下表应该是从0开始那样。

诶,讲着讲着,突然想到subString的index完全可以换成0,

substring = temp.substring(0);

经测试,完全正确。

在这里,我强烈建议使用StringTokenizer这个方法,兼容性强,我自定义的indexOf方法,兼容性不是很强。比如下面这个栗子:

不过,我只是美其名曰,“兼容性更强”,万一没有与目标表达式严格匹配的,它也会返回数据,这一点不是很好。而我的用户体验更好,有没有,嘚瑟一下,嘿嘿。


热评文章