标签:
最近遇到用java正则表达式进行数据输入校验时就查了查java jdk的文档,可是文档中的有些关键词真是让人头大啊,这还不是关键的,最蛋疼的是文档中的解释简单的让人抓狂,于是各种搜索找资料,总算对有些概念有所理解
java正则表达式工具主要由两个类组成,分别是java.util.regex.Pattern模式类和java.util.regex.Matcher匹配器类,至于这些类的用法可以参看jdk的文档,这里主要说一下其中的几个难以理解的关键词
①.greedy,reluctant,possessive(可对照jdk文档的greedy量词,reluctant量词,possessive量词)
greedy是贪婪的,reluctant是勉强的,也可理解为non-greedy非贪婪的,possessive是独占的,占有的,这些关键词只在java正则表达式的量词表达时起作用。如{n,m},{n,m}?,{n,m}+分别表示贪婪的,非贪婪的,独占的匹配算法
greedy算法:在整个正则表达式匹配成功的前提下,量词修饰的字符部分会尽可能多的匹配字符串,如果由于量词部分匹配过多导致整个正则表达式匹配不成功时,该算法会一步步的回退量词匹配的字符串部分,以让整个正则表达式匹配成功
reluctant算法:在整个正则表达式匹配成功的前提下,量词修饰的字符部分会尽可能少的匹配字符串。
possessive算法:跟greedy算法有些类似,只是该算法一旦匹配不成功是不会逐步回退的。该算法也是让量词修饰的正
则表达式部分尽可能多的匹配字符串,但该算法不管整个正则表达式是否成功,一旦量词后面的正则表达式部分不能匹配字符串,匹配就失败,并且也不会回退,而是立即结束匹配
eg.
public class RegExp { public static void main(String[] args) { String str = "aaa4bbb6cc"; String regExp = ".{3,10}\\d"; Pattern pattern = Pattern.compile(regExp); Matcher matcher = pattern.matcher(str); if (matcher.find()) { System.out.println("match string:" + matcher.group() + "\tmatch start:" + matcher.start() + "\tmatch end:" + matcher.end()); } else { System.out.println("not match"); } } }
运行结果:match string:aaa4bbb6 match start:0 match end:8
然后将量词部分{3,10}改成reluctant量词如下
public class RegExp { public static void main(String[] args) { String str = "aaa4bbb6cc"; String regExp = ".{3,10}?\\d"; Pattern pattern = Pattern.compile(regExp); Matcher matcher = pattern.matcher(str); if (matcher.find()) { System.out.println("match string:" + matcher.group() + "\tmatch start:" + matcher.start() + "\tmatch end:" + matcher.end()); } else { System.out.println("not match"); } } }
运行结果:match string:aaa4 match start:0 match end:4
最后将匹配量词改为{3,10}+possessive量词如下
1 public class RegExp { 2 3 public static void main(String[] args) { 4 5 String str = "aaa4bbb6cc"; 6 String regExp = ".{3,10}+\\d"; 7 Pattern pattern = Pattern.compile(regExp); 8 Matcher matcher = pattern.matcher(str); 9 if (matcher.find()) { 10 System.out.println("match string:" + matcher.group() + "\tmatch start:" + matcher.start() + "\tmatch end:" + matcher.end()); 11 } else { 12 System.out.println("not match"); 13 } 14 } 15 }
运行结果:not match
运行结果分析和非捕获组明天继续。。。睡觉。。。
标签:
原文地址:http://www.cnblogs.com/guanfeng/p/4817976.html