零寬度斷言是正則表達式中一種重要方法,它主要用於捕獲指定內容之前或之後的字符串。
(?: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"結尾。