正則表達式-零寬度斷言詳解

零寬度斷言是正則表達式中一種重要方法,它主要用於捕獲指定內容之前或之後的字符串


(?:X):非捕獲組

它用於捕獲包含某一段特徵內容X的字符串,但並不捕獲特徵內容X

比如有一字符串“ID=1234567”,僅想捕獲ID的具體內容“1234567”,而不需要捕獲字符串“ID=”,這裏就可以用非捕獲組(?:ID=)(\d+)

public static void main(String args []){
		Pattern p = Pattern.compile("(?:ID=)(\\d+)");  //編譯正則表達式
		Matcher m = p.matcher("ID=1234567");
		if(m.find()) {
			System.out.println(m.group(1)); //獲得分組1的內容即(\d+)所捕獲的內容
			System.out.println(m.group(0)); //獲得與正則表達式整體匹配的字符串,group(0)與group()等效
			System.out.println(m.group());  //獲得與正則表達式整體匹配的字符串
		}
	}
運行結果:



(?=X):

用於捕獲以特徵內容X開頭的字符串或者捕獲特徵內容X之前的字符串。

比如有一字符串"baidu.com",僅想捕獲“baidu”,而不需要捕獲".com",這裏可以使用(\w+)(?=\.com)

public static void main(String args []){
		Pattern p = Pattern.compile("(\\w+)(?=\\.com)");
		Matcher m = p.matcher("www.baidu.com");
		if(m.find()) {
			System.out.println(m.group(1)); //獲得分組1的內容,即(\w+)所捕獲內容
			System.out.println(m.group(0)); //獲得與正則表達式整體匹配的字符串
			System.out.println(m.group());  //獲得與正則表達式整體匹配的字符串
		}
	}
運行結果:

上面這種情況屬於捕獲特徵內容X之前的字符串。

現在看另外一種情況,比如有現在有一字符串"www.baidu.com", (?=baidu)(.+)捕獲的結果是什麼呢?

public static void main(String args []){
		Pattern p = Pattern.compile("(?=baidu)(.+)");
		Matcher m = p.matcher("www.baidu.com");
		if(m.find()) {
			System.out.println(m.group(1)); //獲得分組1的內容
			System.out.println(m.group(0)); //獲得與正則表達式整體匹配的字符串
			System.out.println(m.group());  //獲得與正則表達式整體匹配的字符串
		}
	}
運行結果:


可見捕獲的是以baidu開頭的字符,而且捕獲了baidu。

總結一下:如果(?=X)放在左邊例如 (?=baidu)(.+),是捕獲以baidu開頭的字符串。

如果(?=x)放在右邊例如(\w+)(?=\.com),是捕獲.com之前的字符串,並且不捕獲.com


(?!X):

與(?=X)相反,!相當於“不等於”的意思。

如果(?!X)放在左邊例如 (?!baidu)(.+),是捕獲不以baidu開頭的字符串。

如果(?!X)放在右邊例如(\w+)(?!\.com),表明待捕獲字符串後面不能是.com。


(?<=X):

捕獲指定內容X之後的字符串或捕獲以指定內容X結尾的字符串

還是以"www.baidu.com"爲例,(?<=www\.)(.+)得到的結果是什麼呢?

public static void main(String args []){
		Pattern p = Pattern.compile("(?<=www\\.)(.+)");
		Matcher m = p.matcher("www.baidu.com");
		if(m.find()) {
			System.out.println(m.group(1)); //獲得分組1的內容
			System.out.println(m.group(0)); //獲得與正則表達式整體匹配的字符串
			System.out.println(m.group());  //獲得與正則表達式整體匹配的字符串
		}
	}

運行結果:


它捕獲的的是指定內容之後的字符串。

(.+)(?<=\.com)又將得到什麼結果呢?

public static void main(String args []){
		Pattern p = Pattern.compile("(.+)(?<=\\.com)");
		Matcher m = p.matcher("www.baidu.com");
		if(m.find()) {
			System.out.println(m.group(1)); //獲得分組1的內容
			System.out.println(m.group(0)); //獲得與正則表達式整體匹配的字符串
			System.out.println(m.group());  //獲得與正則表達式整體匹配的字符串
		}
	}

運行結果:

它捕獲的是以".com"爲結尾的字符串。

總結一下:

如果(?<=X)放在左邊例如 (?<=www\.)(.+),是捕獲"www."後面的字符串,但不捕獲"www."。

如果(?<=x)放在右邊例如(.+)(?<=\.com),是捕獲以".com"結尾的字符串。


(?<!X):

與(?<=X)相反,!相當於“不等於”的意思。

如果(?<!X)放在左邊例如(?<!www\.)(.+),是待捕獲的字符串前面不能是"www."。

如果(?<!X)放在右邊例如(\w+)(?!\.com),表明待捕獲的字符串不能以".com"結尾。

發佈了47 篇原創文章 · 獲贊 28 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章