admin管理员组

文章数量:1579446

这篇文章是java正则表达式的最后一篇,主要介绍匹配的非贪婪数目(reluctant quantifiers),贪婪数目(greedy quantifiers)和占位数(possessive)

非贪婪数目(reluctant quantifier)和贪婪数目(reluctant quantifier)

直接看代码

import java.util.*;
public class Test{
    public static void main(String[] args){
        Pattern p = Patternpile(".{3,8}[0-9]");
        String s = "abgd4asf8";
        Matcher m = p.matcher(s);
        while(m.find()){
            System.out.println(m.start() + "-" + m.end());
        }
    }
}

这里,打印的是0-9,再看下一段代码:

public class Test{
    public static void main(String[] args){
        Pattern p = Patternpile(".{3,8}?[0-9]");
        String s = "abgd4asf8";
        Matcher m = p.matcher(s);
        if(m.find()){
            System.out.println(m.start() + "-" + m.end());
        }
    }
}

这里的输出,可能就有疑惑了,我在{3,8}后面加了一个”?”,而他的输出就变成了0-5,在这里,和上面的做一个对比,很容易看出,第一段代码中,是尽可能多的去匹配符合条件的字符串,而第二段代码是正好相反,是尽可能少的匹配符合条件的字符串,前者,我们把他叫做贪婪数目(greedy quantifiers)的匹配,后者称为非贪婪数目的匹配(reluctant quantifiers)。也就是说,平时,我们在使用正则表达式时,默认是贪婪性的,而我们要求使用非贪婪性的,只要在限定表达式出现次数的后面加一个“?”号就行。这就是贪婪性和非贪婪的区别。

贪婪性和非贪婪性匹配有必要再细说一下。看下面的代码:

public class Test{
    public static void main(String[] args){
        Pattern p = Patternpile(".{3,8}[0-9]");
        String s = "aaaaaa7hh";
        Matcher m = p.matcher(s);
        while(m.find()){
            System.out.println(m.start() + "-" + m.end());
        }
    }
}

上面代码的输出为“0-7”,也就是说,贪婪性匹配在匹配字符串时,首先匹配指定的限定位数最多的那位(这里是8),这个例子中,匹配到第八位后,在找后面那一位数字,但是发现后面没有数字了,那他就让出一位数字来,此时匹配的是7个字符,再看第八位是不是数字,有上面可知,是数字,所以他就匹配成功打印匹配的开始和结束位置,而非贪婪性匹配和它正好相反,先匹配给定的限定位数最少的字符,在匹配后面的,如果不匹配,那么就步进一位,继续匹配,直到匹配为止,如果步进到给定限定数的最大值还不能匹配,那么匹配失败。这里就不给代码了。

占位数(possessive)

理解了上面的贪婪性和非贪婪性匹配后,占位数也很容易理解。

上面的贪婪性匹配不是从最大的限定位数开始匹配么,然后不匹配的话,就把匹配位数的最后一个字符吐出来,在检查是否匹配。而占位数正好相反,它也跟贪婪性匹配一样,首先匹配位数最多的字符,但是他匹配以后,就直接检查整个正则表达式是否匹配字符串,不匹配的话,他就直接返回匹配失败,不会像贪婪性匹配一样,还会吐出一个字符继续检查是否匹配。这样做,有速度上的优势。

好了,到此,写的java正则表达式就完了。这几篇文章都写的不是很好(我也是才开始写),这只是给自己作个总结的,有不对的地方,欢迎指正。

本文标签: 正则表达式Java