Java字符串拆分趣谈

https://www.redelego.cn

Java字符串拆分趣谈 🤔

🐘🐘 String.split() 方法

🐳 🐳 提到 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("当前字符串没有包含逗号");
        }
    }
}
console> 第一部分:🍎 第二部分:一枚红色的苹果

🐳 🐳 这是建立在字符串是确定的情况下,最重要的是分隔符是确定的.否则,麻烦就来了.大约有 12种英文特殊符号,如果直接拿这些特殊符号替换上面代码中的分隔符(中文逗号),这段程序在运行的时候就会出现以下提到的错误.

  • 🐯 \ ^ $ . // ArrayIndexOutOfBoundsException
  • 🐯 | // 正常
  • 🐯 ? * + () [] {} // PatternSyntaxException

🐘🐘 String.split() 转义处理特殊符号匹配问题。

🐳 🐳 看到这,可能有小伙伴会说,“这不是钻牛角尖嘛”,不不不,做技术就应该秉持严谨的态度,否则,老大会给你的绩效打低分的——奖金拿得少,可不是好滋味.那遇到特殊符号该怎么办呢?上正则表达式呗.正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子.

🐳 🐳 那可能又有小伙伴说,"正则表达式那么多,我记不住啊!“别担心,我已经替你想好对策了.下面这个链接是 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()方法的时候,就需要使用正则表达式\\.来替代特殊字符英文逗点".“了.为什么用两个反斜杠呢?因为它本身就是一个特殊字符,需要先转义.也可以使用字符类[]来包含英文逗点”.",它也是一个正则表达式,用来匹配方括号中包含的任意字符.

String cmower = "🍎.一枚红色的苹果";
if (cmower.contains(".")) {
    String [] parts = cmower.split("[.]");
    System.out.println("第一部分:" + parts[0]  +" 第二部分:" + parts[1]);
}

🐘🐘 String.split() Pattern.quote()处理特殊符号匹配问题。

🐳 🐳 除此之外,还可以使用 Pattern 类的quote() 方法来包裹英文逗点".",该方法会返回一个使用\Q\E包裹的字符串.

String cmower = "🍎.一枚红色的苹果";
if (cmower.contains(".")) {
String [] parts = cmower.split(Pattern.quote("."));
    System.out.println("第一部分:" + parts[0]  +" 第二部分:" + parts[1]);
}

🐳 🐳 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("不匹配");
        }
    }
}
console> 第一部分:🍎 第二部分:一枚红色的苹果
         不匹配
         不匹配

🐳 🐳 这时候,正则表达式为(.+)\\.(.+),意味着可以把字符串按照英文逗点拆分成一个字符组,英文小括号()的作用就在于此(可以查看我之前提供的正则表达式手册).由于模式是确定的,所以可以把Pattern表达式放在main()方法外面,通过 static 的预编译功能提高程序的效率.

🐘🐘 String.split() 正则表达式中的断言模式

🐳 🐳 不过,使用 Matcher 来匹配一些简单的字符串时相对比较沉重一些,使用 String 类的split() 仍然是首选,因为该方法还有其他一些牛逼的功能.比如说,你想把分隔符包裹在拆分后的字符串的第一部分.

可以这样做:

String cmower = "🍎,一枚红色的苹果";
if (cmower.contains(",")) {
    String [] parts = cmower.split("(?<=,)");
    System.out.println("第一部分:" + parts[0] + " 第二部分:" + parts[1]);
}
console> 第一部分:🍎, 第二部分:一枚红色的苹果

🐳 🐳 可以看到分隔符","包裹在了第一部分,如果希望包裹在第二部分,可以这样做:

String cmower = "🍎,一枚红色的苹果";
if (cmower.contains(",")) {
    String [] parts = cmower.split("(?=,)");
    System.out.println("第一部分:" + parts[0] + " 第二部分:" + parts[1]);
}

🐳 🐳 可能有些小伙伴很好奇,?<=?= 是什么东东啊?它其实是正则表达式中的断言模式.

苹果

🐘🐘 String.split() 拆分为多个部分

🐳 🐳 温馨提醒:如果对断言模式比较生疏的话,可以查看我之前提供的正则表达式手册.另外,假如说字符串中包含了多个分隔符,而我们只需要2个的话,还可以这样做:方法split()可以传递2个参数,第一个为分隔符,第二个为拆分的字符串个数.直接substring()到原字符串的末尾,也就是说,第二个分隔符处不再拆分,然后就break循环了.

String cmower = "🍎,一枚红色的苹果,咬它。";
if (cmower.contains(",")) {
    String [] parts = cmower.split(",", 2);
    System.out.println("第一部分:" + parts[0] + " 第二部分:" + parts[1]);
}
console> 第一部分:🍎 第二部分:一枚红色的苹果,咬它。

img

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

redelego@cloud

XXXXXXXXXXXXXXX

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值