咦,Java拆分个字符串都这么考究

咦,Java拆分个字符串都这么考究

说到 Java 拆分字符串,我猜你十有八九会撂下一句狠话,“这有什么难的,直接上 String 类的 split() 办法不就拉到了!”假设你真的这么觉得,那可要留意了,工作远没这么简略。

来来来,搬个小板凳坐下。

假设现在有这样一串字符“缄默沉静王二,一枚风趣的程序员”,需求依照中文的逗号“,”进行拆分,这意味着榜首串字符为逗号前面的“缄默沉静王二”,第二串字符为逗号后边的“一枚风趣的程序员”(这不废话)。别的,在拆分之前,要先进行检查,判别一下这串字符是否包括逗号,不然应该抛出反常。

public class Test {
    public static void main(String[] args) {
        String cmower = "缄默沉静王二,一枚风趣的程序员";
        if (cmower.contains(",")) {
            String [] parts = cmower.split(",");
            System.out.println("榜首部分:" + parts[0] +" 第二部分:" + parts[1]);
        } else {
            throw new IllegalArgumentException("当时字符串没有包括逗号");
        }
    }
}
这段代码看起来挺谨慎的,对吧?程序输出的成果完全符合预期:

榜首部分:缄默沉静王二 第二部分:一枚风趣的程序员
这是建立在字符串是确认的情况下,最重要的是分隔符是确认的。不然,费事就来了。

大约有 12 种英文特别符号,假如直接拿这些特别符号替换上面代码中的分隔符(中文逗号),这段程序在运转的时分就会呈现以下说到的过错。

反斜杠 (ArrayIndexOutOfBoundsException)
刺进符号 ^(同上)
美元符号 $(同上)
逗点 .(同上)
竖线 |(正常,没有犯错)
问号 ?(PatternSyntaxException)
星号 *(同上)
加号 +(同上)
左小括号或许右小括号 ()(同上)
左方括号或许右方括号 [](同上)
左大括号或许右大括号 {}(同上)
看到这,或许有小伙伴会说,“这不是钻牛角尖嘛”,不不不,做技能就应该秉持谨慎的情绪,不然,老迈会给你的绩效打低分的——奖金拿得少,可不是好味道。

那遇到特别符号该怎么办呢?上正则表达式呗。

正则表达式是一组由字母和符号组成的特别文本,它能够用来从文本中找出满意你想要的格局的语句。

那或许又有小伙伴说,“正则表达式那么多,我记不住啊!”别忧虑,我现已替你想好对策了。

下面这个链接是 GitHub 上学习正则表达式的一个在线文档,十分具体。遇到正则表达式的时分,掏出这份手册就完事了。记不住那么多正则表达式不要紧啊,活学活用呗。

https://github.com/cdoco/learn-regex-zh

除了这份文档,还有一份:

https://github.com/cdoco/common-regex

作者收集了一些在平常项目开发中经常用到的正则表达式,能够直接拿来用,妙啊。

处理了心病之后,咱们来用英文逗点“.”来替换一下分隔符:

String cmower = "缄默沉静王二.一枚风趣的程序员";
if (cmower.contains(".")) {
    String [] parts = cmower.split(".");
    System.out.println("榜首部分:" + parts[0] +" 第二部分:" + parts[1]);
}
在运用 split() 办法的时分,就需求运用正则表达式 . 来代替特别字符英文逗点“.”了。为什么用两个反斜杠呢?由于它本身便是一个特别字符,需求先转义。

也能够运用字符类 [] 来包括英文逗点“.”,它也是一个正则表达式,用来匹配方括号中包括的恣意字符。

cmower.split("[.]");
除此之外, 还能够运用 Pattern 类的 quote() 办法来包裹英文逗点“.”,该办法会回来一个运用 QE 包裹的字符串。

此刻,String.split() 办法的运用示例如下所示:

String [] parts = cmower.split(Pattern.quote("."));
当经过调试形式进入 String.split() 办法源码的话,会发现以下细节:

return Pattern.compile(regex).split(this, limit);
String 类的 split() 办法调用了 Pattern 类的 split() 办法。也就意味着,咱们拆分字符串有了新的挑选,能够不运用 String 类的 split() 办法了。

public class TestPatternSplit {
    /**
     * 运用预编译功用,进步功率
     */
    private static Pattern twopart = Pattern.compile(".");

    public static void main(String[] args) {
        String [] parts = twopart.split("缄默沉静王二.一枚风趣的程序员");
        System.out.println("榜首部分:" + parts[0] +" 第二部分:" + parts[1]);
    }
}
除此之外,还能够运用 Pattern 合作 Matcher 类进行字符串拆分,这样做的优点是能够对要拆分的字符串进行一些严厉的约束,来看一段示例代码:

public class TestPatternMatch {
    /**
     * 运用预编译功用,进步功率
     */
    private static Pattern twopart = Pattern.compile("(.+).(.+)");

    public static void main(String[] args) {
        checkString("缄默沉静王二.一枚风趣的程序员");
        checkString("缄默沉静王二.");
        checkString(".一枚风趣的程序员");
    }

    private static void checkString(String str) {
        Matcher m = twopart.matcher(str);
        if (m.matches()) {
            System.out.println("榜首部分:" + m.group(1) + " 第二部分:" + m.group(2));
        } else {
            System.out.println("不匹配");
        }
    }
}
这时分,正则表达式为 (.+).(.+),意味着能够把字符串依照英文逗点拆分红一个字符组,英文小括号 ()的效果就在于此(能够检查我之前供给的正则表达式手册)。

由于形式是确认的,所以能够把 Pattern 表达式放在 main() 办法外面,经过 static 的预编译功用进步程序的功率。

来看一下程序的输出成果:

榜首部分:缄默沉静王二 第二部分:一枚风趣的程序员
不匹配
不匹配
不过,运用 Matcher 来匹配一些简略的字符串时相对比较沉重一些,运用 String 类的 split() 仍然是首选,由于该办法还有其他一些牛逼的功用。

比如说,你想把分隔符包裹在拆分后的字符串的榜首部分,能够这样做:

String cmower = "缄默沉静王二,一枚风趣的程序员";
if (cmower.contains(",")) {
    String [] parts = cmower.split("(?<=,)");
    System.out.println("榜首部分:" + parts[0] +" 第二部分:" + parts[1]);
}
程序输出的成果如下所示:

榜首部分:缄默沉静王二, 第二部分:一枚风趣的程序员
能够看到分隔符“,”包裹在了榜首部分,假如期望包裹在第二部分,能够这样做:

String [] parts = cmower.split("(?=,)");
或许有些小伙伴很猎奇,?<= 和 ?= 是什么东东啊?它其实是正则表达式中的断语形式。

温馨提示:假如对断语形式比较陌生的话,能够检查我之前供给的正则表达式手册。

别的,假设说字符串中包括了多个分隔符,而咱们只需求 2 个的话,还能够这样做:

String cmower = "缄默沉静王二,一枚风趣的程序员,宠爱他";
if (cmower.contains(",")) {
    String [] parts = cmower.split(",", 2);
    System.out.println("榜首部分:" + parts[0] +" 第二部分:" + parts[1]);
}
split() 办法能够传递 2 个参数,榜首个为分隔符,第二个为拆分的字符串个数。检查该办法源码的话,你就能够看到以下内容:

直接 substring() 到原字符串的结尾,也便是说,第二个分隔符处不再拆分。然后就 break 出循环了。来看一下程序输出的成果:

榜首部分:缄默沉静王二 第二部分:一枚风趣的程序员,宠爱他

好了,我亲爱的读者朋友,以上便是本文的全部内容了。是不是忽然感觉拆分个字符串真的挺考究的?

我是缄默沉静王二,一枚风趣的程序员。假如觉得文章对你有点协助,请微信查找「 缄默沉静王二 」榜首时间阅览。

回复【666】更有我为你精心预备的 500G 高清教育视频(已分门别类)。本文 GitHub 现已录入,有大厂面试完好考点,欢迎 Star。

原创不易,莫要白票,请你为本文点赞个吧,这将是我写作更多优质文章的最强动力。

原文地址https://www.cnblogs.com/qing-gee/p/12806523.html