閱讀847 返回首頁    go 技術社區[雲棲]


馬士兵 正則表達式的學習(補充)

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


不寫就是關上,寫了就是打開








最後更新:2017-04-02 06:52:15

  上一篇:go Android中定時器Timer和TimerTask的啟動,停止,暫停,繼續等操作實例
  下一篇:go 線程安全的單例模式