不管是零寬仍是斷言。聽起來都是古古怪怪的,先解釋下這兩個名詞。正則表達式
假如咱們要爬蟲抓取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表達式的後面內容,不返回自己