import java.util.regex.Matcher;
import java.util.regex.Pattern;public class RegexDemo2 {
public static void main(String args[]) {
Demo2(); } private static void getDemo() {
// TODO Auto-generated method stub
String str = "ming tian jiuyao fang jia le,da jia";
String reg = "\\b[a-z]{4}\\b";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(str);
while (m.find()) {
System.out.println(m.group());
System.out.println(m.start() + "..." + m.end());
}
} private static void Demo2() { String str="008.109.090.030";
String reg="0+(\\d+)";//Greedy 数量词
Pattern p=Pattern.compile(reg);
 Matcher m=p.matcher(str);
  while( m.find() ){
  System.out.print(m.group()+"--->");
   int len= m.groupCount();
   System.out.print(len+"-----");
   for(int i=0;i<=1;i++){
   System.out.print("group"+"("+i+"):"+m.group(i)+"  ");
   }
   System.out.println("       ");
  }
  System.out.println("++++++++++++++++++++++++++++++++++++++");
   
  String str1="008.109.090.030";
String reg1="0+(\\d+?)";//Reluctant 数量词
Pattern p1=Pattern.compile(reg1);
 Matcher m1=p1.matcher(str1);
  while( m1.find() ){
  System.out.print(m1.group()+"--->");
   int len= m1.groupCount();
   System.out.print(len+"-----");
   for(int i=0;i<=1;i++){
   System.out.print("group"+"("+i+"):"+m1.group(i)+"  ");
   }
   System.out.println("       ");
  }

               
}
}结果:
008--->1-----group(0):008  group(1):8         
09--->1-----group(0):09  group(1):9         
090--->1-----group(0):090  group(1):90         
030--->1-----group(0):030  group(1):30         
++++++++++++++++++++++++++++++++++++++
008--->1-----group(0):008  group(1):8         
09--->1-----group(0):09  group(1):9         
09--->1-----group(0):09  group(1):9         
03--->1-----group(0):03  group(1):3 为什么结果不一样和为什么会出现这样的结果,求解释。

解决方案 »

  1.   

    我想知道这两种数量词在这里的工作机制是怎样的String reg="0+(\\d+)";//Greedy 数量词
    008--->1-----group(0):008  group(1):8         
    09--->1-----group(0):09  group(1):9         
    090--->1-----group(0):090  group(1):90         
    030--->1-----group(0):030  group(1):30         
    这个表达式的匹配规则就是0开头的数字字符串,表达式’\\d‘表示数字匹配,‘+’表示一次或多次匹配前面的字符
    ++++++++++++++++++++++++++++++++++++++
    String reg1="0+(\\d+?)"
    008--->1-----group(0):008  group(1):8         
    09--->1-----group(0):09  group(1):9         
    09--->1-----group(0):09  group(1):9         
    03--->1-----group(0):03  group(1):3 
    表达式中的‘?’表示当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是“非贪心的”。“非贪心的”模式匹配搜索到的、尽可能短的字符串,而默认的“贪心的”模式匹配搜索到的、尽可能长的字符串。例如,在字符串“oooo”中,“o+?”只匹配单个“o”,而“o+”匹配所有“o”,近似于String reg1="0+(\\d)"表达式
      

  2.   

    我想知道这两种数量词在这里的工作机制是怎样的String reg="0+(\\d+)";//Greedy 数量词
    008--->1-----group(0):008  group(1):8         
    09--->1-----group(0):09  group(1):9         
    090--->1-----group(0):090  group(1):90         
    030--->1-----group(0):030  group(1):30         
    这个表达式的匹配规则就是0开头的数字字符串,表达式’\\d‘表示数字匹配,‘+’表示一次或多次匹配前面的字符
    ++++++++++++++++++++++++++++++++++++++
    String reg1="0+(\\d+?)"
    008--->1-----group(0):008  group(1):8         
    09--->1-----group(0):09  group(1):9         
    09--->1-----group(0):09  group(1):9         
    03--->1-----group(0):03  group(1):3 
    表达式中的‘?’表示当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是“非贪心的”。“非贪心的”模式匹配搜索到的、尽可能短的字符串,而默认的“贪心的”模式匹配搜索到的、尽可能长的字符串。例如,在字符串“oooo”中,“o+?”只匹配单个“o”,而“o+”匹配所有“o”,近似于String reg1="0+(\\d)"表达式

    那Possessive 数量词的正则表达式和贪心的正则表达是有什么区别??换成0+(\\d++)的打印结果跟0+(\\d+)是一样的
      

  3.   

    侵占(possessive)在匹配不成功后不会产生回溯,一般很少用到,只有在正则表达式优化中会用到
    贪婪在匹配不成功后会产生回溯
      

  4.   

    大神如果possessive不会朔,这样的话将正则表达式改为0+(\\d++),那不是应该没有结果可以匹配吗。
      

  5.   

    lz不知道正则表达式语法 0+(\\d++)这么改和原来的有区别吗 问号
    lz还不清楚正则表达式的 + ?的语法含义