Java 正则中的(.*?)vs(.*)

  1. public static void main(String[] args) {  
  2.   
  3.         //选择最小和最大重复次数  
  4.         String a="{user=\"administrator\",password=\"root\"}";  
  5.         String b="user   =\"a\"";//注意=号之间有空格  
  6.         String c="user\r\n=\"c\"";//注意有换行符号  
  7.           
  8.         //获取双引号之间的内容,分别获得a,b,c中的所有的用户的名称  
  9.         String regex="(?s)user.*?=(\".*?\")";  
  10.         match(regex,a);//user="administrator"  
  11.         match(regex,b);//user   ="a"  
  12.         match(regex,c);//user  
  13.                        //="c"  
  14.           
  15.         //上面的非常简单,注意以下事例  
  16.         //选择最小和最大重复数  
  17.         //注意以下几点,user =这个之间可能有空格  
  18.         //我们需要的结果是找出user='xxx'的信息,其余不要  
  19.         String notice="[{user='admin',password='admin'}," +  
  20.                        "{user='yhc',password='yhc'}]";  
  21.         //也许大家会觉得.*?为什么需要?号,那么一下我们看看  
  22.         //有?和没有?的区别  
  23.         String regex1="user.*='(.*?)'";//user.*=之间没有?  
  24.         match(regex1, notice);  
  25.         //输出结果(错误):user='admin',password='admin'},{user='yhc',password='yhc'  
  26.           
  27.         String regex2="user.*?='(.*?)'";//user.*=之间有?  
  28.         match(regex2, notice);  
  29.         //输出结果(正确):  
  30.         //user='admin'  
  31.         //user='yhc'  
  32.           
  33.         //为什么上面就因为一个?号而有这么大的区别咧?  
  34.         //解释以上代码运行机制  
  35.         //有了匹配文本中的第一个user之后,引擎就会到达(.*),其中点号(.)可以  
  36.         //匹配任意字符,其中包括换行符,星号(*)则把它重复0次或更多次,请注意,  
  37.         //这里的星号(*)是贪心的,因此点星(.*)会匹配直到目标文件结束的所有的  
  38.         //内容,注意=====>>>>(.*)会吃了所有的目标文件内容,从第一个匹配  
  39.         //user的地方开始;  
  40.           
  41.         //当(.*)把肚子吃饱之后,引擎才会试图去匹配在目标文本末尾的=  
  42.         //这个表达式,当然,一定会匹配失败,但这并不会代表此次匹配就结束了,  
  43.         //正则引擎会进行回溯backtrack,当匹配某一个位置之后  
  44.         //,正则表达式都会保存一个回溯位置,如果正则表达式匹配之后的文本失败后  
  45.         //那么正则引擎还可以回到这些位置  
  46.         //当=匹配匹配失败之后,引擎进行回溯,让(.*)放弃它的匹配中的一个  
  47.         //字符接着=会被再次尝试匹配,这次在文本中的最后一个字符的位置,  
  48.         //如果依然失败的话,那么引擎会再一次进行回溯在文件的倒数第2个字符出尝试匹配  
  49.         //这个过程会一直继续,直到=匹配成功位置,如果一直没有匹配成功,那么最终(.*)  
  50.         //会用完所有的回溯位置,然后正则匹配失败  
  51.           
  52.         //如果在整个回溯的过程中=在某个点匹配成功,那么就会接着尝试匹配'如果'匹配  
  53.         //失败,引擎接着进行回溯,这个过程会一直重复,直到='(.*?)'可以被匹配为止  
  54.           
  55.         //问题就出现在.*上,因为星号是贪心的,所以你们要注意哦!  
  56.         //我们需要使用lazy 懒惰 可以在后面放一个?使其变为懒惰  
  57.         //例如:(*?),(+?),(??) ,{1,100}? 都可以将其变为懒惰   
  58.           
  59.     }  
  60.       
  61.     public static void match(String regex,String input){  
  62.             //创建正则对象  
  63.             Pattern pattern=Pattern.compile(regex);  
  64.             //匹配对象  
  65.             Matcher matcher=pattern.matcher(input);  
  66.             //输出匹配字符串  
  67.             while(matcher.find()){  
  68.                 System.out.println(matcher.group());  
  69.             }  
  70.     }  

如果以上有写错误的地方,请大家指出,thanks!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值