马士兵 正则表达式的学习(补充)

none-capturing groups

特殊构造(非捕获)

package com.zzk.cn;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    /**
     * @param args
     */
    public static void main(String[] args) {
   	
    	//non-capturing groups
		Pattern p = Pattern.compile(".{3}");//三个字母
		String s = "44a66b";
		Matcher m = p.matcher(s);
		while(m.find()) {
			p(m.group());//找到两个字串
		}
    	}

    
    public static void p(Object o) {
    	System.out.println(o);
    }
}

输出:

44a
66b


package com.zzk.cn;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    /**
     * @param args
     */
    public static void main(String[] args) {
   	
    	//non-capturing groups
		Pattern p = Pattern.compile(".{3}(?=a)");//三个字母的后面出现一个a,不捕获a
		String s = "44a66b";
		Matcher m = p.matcher(s);
		while(m.find()) {
			p(m.group());//显示不了
		}
    	}

    
    public static void p(Object o) {
    	System.out.println(o);
    }
}

输出:

无任何显示信息



package com.zzk.cn;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    /**
     * @param args
     */
    public static void main(String[] args) {
   	
    	//non-capturing groups
		Pattern p = Pattern.compile(".{3}(?=a)");//三个字母的后面出现一个a,不捕获a
		String s = "444a66b";
		Matcher m = p.matcher(s);//捕获3个字母,不捕获a
		while(m.find()) {
			p(m.group());//显示不了
		}
    	}

    
    public static void p(Object o) {
    	System.out.println(o);
    }
}

输出:

444

package com.zzk.cn;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    /**
     * @param args
     */
    public static void main(String[] args) {
   	
    	//non-capturing groups
		Pattern p = Pattern.compile("(?=a).{3}");//符合条件就捕获,不符合条件就不捕获
		String s = "444a66b";
		Matcher m = p.matcher(s);
		while(m.find()) {
			p(m.group());
		}
    	}

    
    public static void p(Object o) {
    	System.out.println(o);
    }
}

输出:

a66


package com.zzk.cn;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    /**
     * @param args
     */
    public static void main(String[] args) {
   	
    	//non-capturing groups
		Pattern p = Pattern.compile("(?!a).{3}");//前面不能是a的
		String s = "444a66b";
		Matcher m = p.matcher(s);
		while(m.find()) {
			p(m.group());
		}
    	}

    
    public static void p(Object o) {
    	System.out.println(o);
    }
}

输出:

444
66b


package com.zzk.cn;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    /**
     * @param args
     */
    public static void main(String[] args) {
   	
    	//non-capturing groups
		Pattern p = Pattern.compile(".{3}(?!a)");
		String s = "444a66b";//后面跟着的不是a
		Matcher m = p.matcher(s);
		while(m.find()) {
			p(m.group());
		}
    	}

    
    public static void p(Object o) {
    	System.out.println(o);
    }
}

输出:

44a
66b


package com.zzk.cn;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    /**
     * @param args
     */
    public static void main(String[] args) {
   	
    	//non-capturing groups
		Pattern p = Pattern.compile(".{3}(?<!a)");//从后往前数不是a
		String s = "444a66b";//444从后往前不是a,a66从后往前不是a
		Matcher m = p.matcher(s);
		while(m.find()) {
			p(m.group());
		}
    	}

    
    public static void p(Object o) {
    	System.out.println(o);
    }
}

输出:

444
a66


package com.zzk.cn;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    /**
     * @param args
     */
    public static void main(String[] args) {
   	
    	//non-capturing groups
		Pattern p = Pattern.compile(".{3}(?<=a)");//从后往前数不是a
		String s = "444a66b";//444从后往前不是a,a66从后往前是a
		Matcher m = p.matcher(s);
		while(m.find()) {
			p(m.group());
		}
    	}

    
    public static void p(Object o) {
    	System.out.println(o);
    }
}

输出:

44a



package com.zzk.cn;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    /**
     * @param args
     */
    public static void main(String[] args) {
   	
    	//back references向前引用
    	Pattern p=Pattern.compile("(\\d\\d)\\1");//  \\d\\d代表两个数字    \\1代表第一个组捕获的字符串
    	String s="1212";
    	Matcher m=p.matcher(s);
    	p(m.matches());
    	}

    
    public static void p(Object o) {
    	System.out.println(o);
    }
}

输出:

true


比较:

package com.zzk.cn;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    /**
     * @param args
     */
    public static void main(String[] args) {
   	
    	//back references向前引用
    	Pattern p=Pattern.compile("(\\d\\d)\\1");//  \\d\\d代表两个数字    \\1代表第一个组捕获的字符串
    	String s="1213";
    	Matcher m=p.matcher(s);
    	p(m.matches());
    	}

    
    public static void p(Object o) {
    	System.out.println(o);
    }
}

输出:

false


package com.zzk.cn;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    /**
     * @param args
     */
    public static void main(String[] args) {
   	
    	//back references向前引用
    	Pattern p=Pattern.compile("(\\d(\\d))\\2");//  两个组,看到一个左(是一个组!!!         2代表和第二个组匹配
    	String s="122";//第一个组是1  第二个组是2                  2和第二个组匹配
    	Matcher m=p.matcher(s);
    	p(m.matches());
    	}

    
    public static void p(Object o) {
    	System.out.println(o);
    }
}

输出:

true


package com.zzk.cn;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    /**
     * @param args
     */
    public static void main(String[] args) {
   	
    	//flags的简写
    	Pattern p=Pattern.compile("java",Pattern.CASE_INSENSITIVE);//大写小忽略

    }
    
    public static void p(Object o) {
    	System.out.println(o);
    }
}
输出:

true


package com.zzk.cn;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    /**
     * @param args
     */
    public static void main(String[] args) {
   	
    	//flags的简写
    	//Pattern p=Pattern.compile("java",Pattern.CASE_INSENSITIVE);//大写小忽略
    	p("Java".matches("(?i)(java)"));//以上的简写
    }
    
    public static void p(Object o) {
    	System.out.println(o);
    }
}

输出:

true


CASE_INSENSITIVE

public static final int CASE_INSENSITIVE
启用不区分大小写的匹配。

默认情况下,不区分大小写的匹配假定仅匹配 US-ASCII 字符集中的字符。可以通过指定 UNICODE_CASE 标志连同此标志来启用 Unicode 感知的、不区分大小写的匹配。

通过嵌入式标志表达式  (?i) 也可以启用不区分大小写的匹配。

指定此标志可能对性能产生一些影响。

另请参见:



(?idmsux-idmsux) Nothing,但是将匹配标志i d m s u x on - off


不写就是关上,写了就是打开








你可能感兴趣的:(java,正则表达式,String,object,嵌入式,Class)