零寬斷言

不管是零寬仍是斷言。聽起來都是古古怪怪的,先解釋下這兩個名詞。正則表達式

 

  • 零寬:就是沒有寬度,在正則中,斷言只是匹配位置,不佔字符,也就是說,匹配結果是不會返回斷言自己的。
  • 斷言:就是「我判定什麼」,在正則中能夠指明在指定內容的前面或者後面會出現指定規則的內容。

假如咱們要爬蟲抓取CSDN裏文章的閱讀數量。經過查看源代碼能夠看到這樣的結構。spa

"<span class="read-count">閱讀數:641</span>"code

也就是641這個數字,那用正則怎麼獲取這個數字呢,正則應該怎麼匹配呢?blog

  • 正向先行斷言

語法:(?=pattern)字符串

做用:匹配pattern表達式前面內容,不返回自己class

好吧,迴歸那個列子,要取到閱讀量,在正則表達式中就意味着要匹配到</span>前面的數字內容,那麼能夠這樣寫 (?=</span>) 就能夠匹配到前面的內容了。語法

String regex = ".+(?=</span>)";
    String text = "<span class=\"read-count\">閱讀數:641</span>";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(text);
    while (matcher.find()) {
        System.out.println("匹配所有結果:" + matcher.group());
    }
    // 匹配所有結果:<span class="read-count">閱讀數:641

 

String regex = "\\d+(?=</span>)";
    String text = "<span class=\"read-count\">閱讀數:641</span>";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(text);
    while (matcher.find()) {
        System.out.println("匹配數字:" + matcher.group());
    }
    // 匹配數字:641

  •  正向後行斷言

語法:(?<=pattern)di

做用:匹配pattern表達式後面的內容,不返回自己while

正向先行是匹配前面的內容,那麼正向後行就是匹配後面的內容了。上面的例子能夠用正向後行處理。co

String regex = "(?<=<span class=\\\"read-count\\\">閱讀數:)\\d+";
    String text = "<span class=\"read-count\">閱讀數:641</span>";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(text);
    while (matcher.find()) {
        System.out.println("匹配數字:" + matcher.group());
    }
    // 匹配數字:641
  • 負向先行斷言

語法:(?!pattern)

做用:匹配非表達式前面的內容,不返回自己

有正向就有負向,這裏的負向是非的意思。

舉個例子:好比有一句話"我愛祖國,我是祖國的花朵",如今要找到不是「的花朵」前面的祖國,如今能夠這樣寫   "祖國(?!的花朵)"

 

String regex = "祖國(?!的花朵)";
    String text = "我愛祖國,我是祖國的花朵";
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(text);
    while (matcher.find()) {
        System.out.println("匹配字符串:" + matcher.group());
    }
    // 匹配字符串:祖國
  • 負向後行斷言

語法:(?<!pattern)

做用:匹配非pattern表達式的後面內容,不返回自己

相關文章
相關標籤/搜索