Java簡單爬蟲系列(3)---正則表達式和Java正則API的使用

上一篇內容寫了如何請求資源,那麼資源請求下載以後咱們就要對它就行解析了,解析以前咱們先熟悉一下正則表達式java

正則表達式在日常使用時仍是很普遍的,好比說表單輸入驗證,驗證手機號郵箱之類,Java的字符串匹配實現等都用到了正則,正則表達式的規則也不是不少,我簡單寫幾種,若是你想詳細的瞭解學習正則表達式,推薦閱讀正則表達式30分鐘入門教程,寫的很全面,講解的也很到位。web

我要寫的是使用過程
正則表達式

下面是一些經常使用的學習


元字符測試

  1. \b 用於單詞的間隙處,\bhello\b表示匹配hello單詞spa

  2. \d 匹配數字 0\d\d 表示匹配011,023,以0開頭三位數字,還能夠寫成0\d{2},0後面兩個數字.net

  3. .  匹配換行符之外的全部字符code

  4. * 它前面的字符能夠無限重複htm

  5. \s 任意的空白符 ,好比空格,TAB對象

  6. \w 字母或數字或下劃線或漢字等

  7. + 和*相似,可是+至少一次,*可能0此

  8. ^ 字符串開始

  9. $ 字符串結束

  10. {5,12} 長度限制在5到12之間

  11. ? 重複0到1次

  12. [ ] 表示須要查找的內容,好比[aeiou]包含元音字母,[.?*]包含.?*的串

字符轉義

  1. 用 \ 來轉義元字符,好比要查找含*的串,\* == *

分支條件

  1. | 表示或,兩個表達式鏈接 a|b,表示知足表達式a或者b

分組

  1. ()分組,能夠把多個匹配放到一塊,重複查找

反義

  1. \W\S\D\B把小寫改爲大寫,[]裏的加^,好比[^aeiou]不是元音字母

註釋

  1. (?#comment) 對錶達式進行註釋,好比 2\d[0-2](?#200-292)   表示200-292之間的數字

貪婪與懶惰

  1. a.*b,它將會匹配最長的以a開始,以b結束的字符串。若是用它來搜索aabab的話,它會匹配整個字符串aabab。這被稱爲貪婪匹配。

  2. 在 . * ? {n,m}等後面加?則表示儘量少的匹配,.? *? ?? {n,m}?

可能你看了上面仍是不知道在說什麼沒關係,下面寫了java的正則API以後會舉例說明

java.util.regex 包主要由三個類所組成:Pattern、Matcher 和 PatternSyntaxException。

Pattern 對象表示一個已編譯的正則表達式。Pattern 類沒有提供公共的構造方法。要構建一個模式,首先必須調用公共的靜態 compile 方法,它將返回一個 Pattern 對象。這個方法接受正則表達式做爲第一個參數。

Matcher 是一個靠着輸入的字符串來解析這個模式和完成匹配操做的對象。與 Pattern 類似,Matcher 也沒有定義公共的構造方法,須要經過調用 Pattern 對象的 matcher 方法來得到一個 Matcher 對象。

PatternSyntaxException 對象是一個未檢查異常,指示了正則表達式中的一個語法錯誤。

使用的流程能夠分爲下面幾個步驟

  1. Pattern的compile靜態方法獲取pattern對象

  2. pattern調用自身的matcher方法返回Matcher對象matcher

  3. matcher對象經過find,matches,lookingAt等方法進行匹配

下面是個示例,要找到匹配ae,be,de,he之中的任意一個

package com.hldh.river.regex;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by liuhj on 2016/1/5.
 * 本例用於測試JDK1.7 中的Matcher和Pattern
 *
 * 使用時主要是Pattern編譯正則,Matcher用來匹配字符串
 */
public class AppTest {

    public static void main(String args[]){
        String regexStr = "[abdh]e";
        String targetStr = "hello world";
        //獲取Pattern對象
        Pattern pattern = Pattern.compile(regexStr);
        // 定義一個matcher用來作匹配
        Matcher matcher = pattern.matcher(targetStr);
        if (matcher.find()) {
            System.out.println(matcher.group());
        }
    }

}

輸出結果

he

是否是很簡單,主要的難點仍是在正則表達式的掌握上,API很好理解

還有一個點我以爲須要說明一下,就是group,正則表達式裏有個分組的概念,好比說「^([abdh]e)(\d+)$」這裏面就是兩個分組,對應API裏的group(int group),參數裏是2的話就對應匹配(\d+),參數是1的話對應匹配([abdh]e),參數0是系統默認,表示匹配整個串。

使用group就能夠把匹配到的字符竄捕獲。

Matcher中find方法是匹配字符串中的一部分,matches匹配整個字符串,因此啊你看錶單驗證都是用的matches方法。

相關文章
相關標籤/搜索