零寬度斷言是正規表達式中一種重要方法,它主要用于捕獲指定内容之前或之後的字元串。
(?: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()); //獲得與正規表達式整體比對的字元串
}
}
運作結果:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiIXZ05WZD9CX5RXa2Fmcn9CXwczLcVmds92czlGZvwVP9EUTDZ0aRJkSwk0LcxGbpZ2LcBDM08CXlpXazRnbvZ2LcRlMMVDT2EWNvwFdu9mZvwldGdlYmxGWiZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DOygjN0kTN2ETNxQDM0EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
(?=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"結尾。