天天看點

正規表達式-零寬度斷言詳解(?:X):非捕獲組(?=X):用于捕獲以特征内容X開頭的字元串或者捕獲特征内容X之前的字元串。

零寬度斷言是正規表達式中一種重要方法,它主要用于捕獲指定内容之前或之後的字元串。

(?: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開頭的字元串或者捕獲特征内容X之前的字元串。

(?=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):非捕獲組(?=X):用于捕獲以特征内容X開頭的字元串或者捕獲特征内容X之前的字元串。

上面這種情況屬于捕獲特征内容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());  //獲得與正規表達式整體比對的字元串
		}
	}
           

運作結果:

正規表達式-零寬度斷言詳解(?:X):非捕獲組(?=X):用于捕獲以特征内容X開頭的字元串或者捕獲特征内容X之前的字元串。

可見捕獲的是以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());  //獲得與正規表達式整體比對的字元串
		}
	}
           

運作結果:

正規表達式-零寬度斷言詳解(?:X):非捕獲組(?=X):用于捕獲以特征内容X開頭的字元串或者捕獲特征内容X之前的字元串。

它捕獲的的是指定内容之後的字元串。

那(.+)(?<=\.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());  //獲得與正規表達式整體比對的字元串
		}
	}
           

運作結果:

正規表達式-零寬度斷言詳解(?:X):非捕獲組(?=X):用于捕獲以特征内容X開頭的字元串或者捕獲特征内容X之前的字元串。

它捕獲的是以".com"為結尾的字元串。

總結一下:

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

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

(?<!X):

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

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

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