用於查找在某些內容(但並不包括這些內容)以前或以後的東西java
零寬度正預測先行斷言 - (?=exp)正則表達式
匹配exp前面的位置測試
正則表達式:.+(?=://) 原始字符串:http://localhost:8080/awesome-god?love=1000&believe=true 獲得的結果:http
零寬度正回顧後發斷言 - (?<=exp).net
匹配exp後面的位置code
正則表達式:(?<=\?).+ 原始字符串:http://localhost:8080/awesome-god?love=1000&believe=true 獲得的結果:love=100&believe=true
零寬度負預測先行斷言 - (?!exp)blog
匹配後面跟的不是exp的位置文檔
正則表達式:\d{4}(?!&) 原始字符串:http://localhost:8080/awesome-god?love=1000&believe=true 獲得的結果:8080
零寬度負回顧後發斷言 - (?<!exp)字符串
匹配前面不是exp的位置get
正則表達式:(?<!=)\d{4} 原始字符串:http://localhost:8080/awesome-god?love=1000&believe=true 獲得的結果:8080
附Java測試代碼:it
完整代碼
import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Some tools for Regex */ public class RegexUtils { /** * 根據正則表達式提取字符串 * [@param](https://my.oschina.net/u/2303379) str * [@param](https://my.oschina.net/u/2303379) regex * [@return](https://my.oschina.net/u/556800) */ public static String[] find(String str, String regex) { if (isEmpty(str)) { return new String[0]; } Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(str); List<String> list = new LinkedList<>(); while(matcher.find()) { list.add(matcher.group()); } return list.toArray(new String[list.size()]); } public static void main(String[] args) { String[] array; String str = "http://localhost:8080/awesome-god?love=1000&believe=true"; array = find(str, ".+(?=://)"); System.out.println("1. 零寬度正預測先行斷言 - (?=exp): " + Arrays.toString(array)); array = find(str, "(?<=\\?).+"); System.out.println("2. 零寬度正回顧後發斷言 - (?<=exp): " + Arrays.toString(array)); array = find(str, "\\d{4}(?!&)"); System.out.println("3. 零寬度負預測先行斷言 - (?!exp): " + Arrays.toString(array)); array = find(str, "(?<!=)\\d{4}"); System.out.println("4. 零寬度負回顧後發斷言 - (?<!exp): " + Arrays.toString(array)); } }
輸出結果
1. 零寬度正預測先行斷言 - (?=exp): [http] 2. 零寬度正回顧後發斷言 - (?<=exp): [love=1000&believe=true] 3. 零寬度負預測先行斷言 - (?!exp): [8080] 4. 零寬度負回顧後發斷言 - (?<!exp): [8080]
參考文檔:正則表達式之零寬斷言