[Java]_[初级]_[高效使用String.split的方法]

Posted infoworld

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Java]_[初级]_[高效使用String.split的方法]相关的知识,希望对你有一定的参考价值。

场景

  1. 在开发Java Web项目时, 往往需要分析uri来做一些转发控制逻辑,如/online/android/info/support.html, 对uri的不同部分做处理. 一般情况下使用String.split(str)方法进行分割,但其实这个方法有更高效率的用法。

说明

  1. String.split方法有两个重载方法,分别是带和不带limit参数的.

    String[] split(String regex);
    String[] split(String regex,int limit);
    
  2. 不带参数的split其实就是调用split(regex,0). 所以这里说下第二个方法. 它的limit参数是有符号的整数,支持正整数,负整数和0.

    • 正整数: 模式匹配会应用最多limit -1次,数组长度不会超过limit,并且数组的最后一个元素包含最后匹配的分割符之后的所有字符串。说明:也就是这个limit是限制了分割的次数,如果应用的uri最多只是3级,那么我们可以使用limit限定次数,当一些不支持的uri出现时可以直接丢弃.如uri最多只支持/xx/xx/xx.html. 而如果接收到/xx/xx/xx/xx.html,那么使用String.split(str,4)时获取的数组最后的元素是xx/xx.html,这时候判断这个字符串不符合要求,可以直接跳转到404.

    • 0: 模式匹配将会应用最大的次数,数组可能是任意大小,如果最后的分割符之后的字符串是空字符串,那么回丢弃,不会存入数组里,但是第一个分割符之前如果是空字符串,那么会保留。如字符串 /online/分割后得到的数组是["","online"].

    • 任意负数: 只要是负数,任何负数值都是一样的。它的规则是0一样,执行所有的分割符查询,之后如果最后一个分割符后是空字符串,那么也会存入数组里。如 /online/分割后得到["","online",""].

例子

package com.example.string;

import org.junit.jupiter.api.Test;

/**
 * Unit test for simple App.
 */
class AppTest {


    private String format(String [] args){
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        for (String one : args) 
            sb.append("\\"").append(one).append("\\",");

        sb.replace(sb.length()-1, sb.length(), "]");
        
        return sb.toString();
    }

    public String tag(int limit){
        return "limit "+limit+" ->";
    }

    public void print(String str){
        System.out.println(str);
    }

    @Test
    void testStringSplit(){
        
        String kOnlineSlash2 = "/online/";
        String[] parts = kOnlineSlash2.split("/", 4);
        print(kOnlineSlash2);
        print(tag(4)+format(parts));

        // 相当于split("/");
        parts = kOnlineSlash2.split("/",0);
        print(tag(0)+format(parts));

        parts = kOnlineSlash2.split("/",-2);
        print(tag(-2)+format(parts));

        String kOnlineSlash1 = "/online";
        print(kOnlineSlash1);
        parts = kOnlineSlash1.split("/", 4);
        print(tag(4)+format(parts));

        String kOnlineSlash3 = "/online/android/help.html";
        print(kOnlineSlash3);
        parts = kOnlineSlash3.split("/", 4);
        print(tag(4)+format(parts));    

        String kOnlineHtml = "/online.html";
        print(kOnlineHtml);
        parts = kOnlineHtml.split("/", 4);
        print(tag(4)+format(parts));

        
        String kOnlineAndroid = "/online/android";
        print(kOnlineAndroid);
        parts = kOnlineAndroid.split("/", 4);
        print(tag(4)+format(parts));

        String kOnlineAndroidHtml = "/online/android.html";
        print(kOnlineAndroidHtml);
        parts = kOnlineAndroidHtml.split("/", 4);
        print(tag(4)+format(parts));

        String kOnlineAndroidSlashEnd = "/online/android/";
        print(kOnlineAndroidSlashEnd);
        parts = kOnlineAndroidSlashEnd.split("/", 4);
        print(tag(4)+format(parts));
        
        String kOnlineSlash4 = "/online/android/info/support.html";
        print(kOnlineSlash4);
        parts = kOnlineSlash4.split("/", 4);
        print(tag(4)+format(parts));

    }
}

输出

/online/
limit 4 ->["","online",""]
limit 0 ->["","online"]
limit -2 ->["","online",""]
/online
limit 4 ->["","online"]
/online/android/help.html
limit 4 ->["","online","android","help.html"]
/online.html
limit 4 ->["","online.html"]
/online/android
limit 4 ->["","online","android"]
/online/android.html
limit 4 ->["","online","android.html"]
/online/android/
limit 4 ->["","online","android",""]
/online/android/info/support.html
limit 4 ->["","online","android","info/support.html"]

参考

  1. Java String split

以上是关于[Java]_[初级]_[高效使用String.split的方法]的主要内容,如果未能解决你的问题,请参考以下文章

[Java]_[初级]_[使用正则高效替换字符串的多个占位符为多个值]

[Java]_[初级]_[使用正则高效替换字符串的多个占位符为多个值]

[Java]_[初级]_[可变参数的使用技巧]

[Java]_[初级]_[并发下使用AtomicReference来保证原子读写对象]

[Java]_[初级]_[并发下使用AtomicReference来保证原子读写对象]

[Java语言特性]_[初级]_[可变参数的使用技巧]