admin管理员组文章数量:1579083
这篇文章是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正则表达式(三) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1727845300a1133018.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论