Java源码___String类(八)

java.lang.String分析摘要:
<1>matches(String regex)方法
<2>contains(CharSequence s)方法
<3>replaceFirst(String regex, String replacement)
<4>replaceAll(String regex, String replacement)
<5>split重载方法

1.matches(String regex)方法
 该方法根据this字符串适配和regex匹配返回一个boolean值。

public boolean matches(String regex){
    return Pattern.matches(regex, this);
}

这个方法是的属性有:public公有的。
参数:regex这是String类型,为正则表达式

返回值:boolean类型
返回值说明:如果this字符串和是实参regex的规则匹配,则返回true,否则返回false。。

该方法注意点:
该方法并不自己实现,而是通过调用Pattern.matches(String regex, CharSequence input)来实现。

 
2. contains(CharSequence s)方法
 该方法的作用判断字符串中是否包含字符序列S。

public boolean contains(CharSequence s){
    return indexOf(s.toString()) > -1;
}

这个方法是的属性有:public公有。
参数:s字符序列,String也属于字符序列

返回值:boolean类型
返回值说明:如果this字符串包含字符序列s则返回true,否则返回false。

该方法注意点:
该方法并不自己实现,而是通过indexOf(String str)方法来获取下标,但是这边indexOf如果对于空字符串的话,会返回0,也就是说contains("")的返回值总是为true

该源码的思路是:
<1>底层调用indexOf(String str)方法,获取str在this字符串中的下标。
<2>因为如果没有找到的话,indexOf会返回-1,所以拿返回值跟-1比较就能得到真假。

 

3.replaceFirst(String regex, String replacement)方法
 该方法会将this字符串中第一次出现符合regex正则表达式的符号替换成replacement字符串。

public String replaceFirst(String regex, String replacement){
    return Pattern.compile(regex).matcher(this).replaceFirst(replacement);
}

这个方法是的属性有:public公有。
参数:regex正则表达式
参数:replacement替换的字符
返回值:String类型
返回值说明:如果this字符串不包含regex,则返回this,否则返回首次出现符合regex被replacement替代的字符串。


 

4. replaceAll(String regex, String replacement)方法

 该方法的作用将this字符串中所有符合正则表达式regex的字符替换成实参replacement。

public String replaceAll(String regex, String replacement){
    return Pattern.compile(regex).matcher(this).replaceAll(replacement);
}

这个方法是的属性有:public公有。
参数:regex正则表达式
参数:replacement替换的字符
返回值:boolean类型
返回值说明:如果this字符串不包含regex,则返回this,否则返回 符合regex都被replacement替代后的字符串。

5. split重载方法

 该方法会用实参regex(字符串或根据正则表达式)来切割this字符串,并返回字符串数组。

public String[] split(String regex){
    return split(regex, 0);
}

public String[] split(String regex, int limit){
    char ch = 0;
    //<1>regex为一个字符,并且不属于.$|()[{^?*+\中的任何一个字符
    //<2>regex为两位字符,并且不以"\"开头,且第二个字符不属于数字、字母的
    //如果属于这两者则执行if中的方法
    if(((regex.value.length==1 && 
        ".$|()[{^?*+\\".indexOf(ch=regex.charAt(0))==-1) ||
        (regex.length()==2 && 
            regex.charAt(0)=='\\' &&
            (((ch=regex.charAt(1)-'0')|('9'-ch)<0))<0 && 
             (ch-'a')|'z'-ch)<0 &&
             ((ch-'A')|'Z'-ch))<0)) && 
             (ch < Character.MIN_HIGH_SURROGATE ||
             ch > Character.MAX_LOW_SURROGATE))
    {
        int off = 0;
        int next = 0;
        boolean limited = limit>0;
        ArrayList<String> list = new ArrayList<>();
        //如果regex为一个字符,则ch=regex第一个字符
        //如果regex为两个字符,则ch=regex第二个字符
        //如果this字符串中包含ch的字符则进入while循环
        while((next = indexOf(ch,off)) != -1)){
            if(!limited || list.size()<limit-1){
                list.add(substring(off,next));
                off = next+1;
            }else{
                list.add(substring(off,value.length));
                off = value.length;
                break;
            }
        }
        //如果没有找到匹配项,则返回this
        if(off == 0){
            return new String[]{this};
        }
        //添加剩余部分
        if(!limited || list.size()<limit){
            list.add(substring(off,value.length));
        }
        int resultSize = list.size();
        if(limit == 0){
            while(resultSize>0 && list.get(resultSize-1).length==0){
                resultSize--;
            }
        }
        String[] result = new String[resultSize];
        return list.subList(0,resultSize).toArray(result);
    }
    return Pattern.compile(regex).split(this,limit);
}

这个方法是的属性有:public公有。
参数:regex正则表达式或者字符串
参数:limit限制返回的数组的最大值,如果完全切割完毕后的数组长度小于该值,则返回真实长度数组。如果传0,则代表不限制。
返回值:String[] 字符串数组类型
返回值说明:返回切割后的字符串数组。

猜你喜欢

转载自blog.csdn.net/pseudonym_/article/details/80419943