java正则表达式爬虫_Java简单爬虫系列(3)---正则表达式和Java正则API的使用
上一篇內(nèi)容寫了如何請(qǐng)求資源,那么資源請(qǐng)求下載之后我們就要對(duì)它就行解析了,解析之前我們先熟悉一下正則表達(dá)式
正則表達(dá)式在平常使用時(shí)還是很廣泛的,比如說表單輸入驗(yàn)證,驗(yàn)證手機(jī)號(hào)郵箱之類,Java的字符串匹配實(shí)現(xiàn)等都用到了正則,正則表達(dá)式的規(guī)則也不是很多,我簡(jiǎn)單寫幾種,如果你想詳細(xì)的了解學(xué)習(xí)正則表達(dá)式,推薦閱讀正則表達(dá)式30分鐘入門教程,寫的很全面,講解的也很到位。
我要寫的是使用過程
下面是一些常用的
元字符
\b 用于單詞的間隙處,\bhello\b表示匹配hello單詞
\d 匹配數(shù)字 0\d\d 表示匹配011,023,以0開頭三位數(shù)字,還可以寫成0\d{2},0后面兩個(gè)數(shù)字
. ?匹配換行符以外的所有字符
* 它前面的字符可以無限重復(fù)
\s 任意的空白符 ,比如空格,TAB
\w?字母或數(shù)字或下劃線或漢字等
+ 和*類似,但是+至少一次,*可能0此
^ 字符串開始
$ 字符串結(jié)束
{5,12} 長(zhǎng)度限制在5到12之間
? 重復(fù)0到1次
[ ] 表示需要查找的內(nèi)容,比如[aeiou]包含元音字母,[.?*]包含.?*的串
字符轉(zhuǎn)義
用 \ 來轉(zhuǎn)義元字符,比如要查找含*的串,\* == *
分支條件
| 表示或,兩個(gè)表達(dá)式連接?a|b,表示滿足表達(dá)式a或者b
分組
()分組,可以把多個(gè)匹配放到一塊,重復(fù)查找
反義
\W\S\D\B把小寫改成大寫,[]里的加^,比如[^aeiou]不是元音字母
注釋
(?#comment) 對(duì)表達(dá)式進(jìn)行注釋,比如 2\d[0-2](?#200-292) ? 表示200-292之間的數(shù)字
貪婪與懶惰
a.*b,它將會(huì)匹配最長(zhǎng)的以a開始,以b結(jié)束的字符串。如果用它來搜索aabab的話,它會(huì)匹配整個(gè)字符串a(chǎn)abab。這被稱為貪婪匹配。
在 . * ? {n,m}等后面加?則表示盡可能少的匹配,.? *? ?? {n,m}?
可能你看了上面還是不知道在說什么不要緊,下面寫了java的正則API之后會(huì)舉例說明
java.util.regex 包主要由三個(gè)類所組成:Pattern、Matcher 和 PatternSyntaxException。
Pattern 對(duì)象表示一個(gè)已編譯的正則表達(dá)式。Pattern 類沒有提供公共的構(gòu)造方法。要構(gòu)建一個(gè)模式,首先必須調(diào)用公共的靜態(tài) compile 方法,它將返回一個(gè) Pattern 對(duì)象。這個(gè)方法接受正則表達(dá)式作為第一個(gè)參數(shù)。
Matcher 是一個(gè)靠著輸入的字符串來解析這個(gè)模式和完成匹配操作的對(duì)象。與 Pattern 相似,Matcher 也沒有定義公共的構(gòu)造方法,需要通過調(diào)用 Pattern 對(duì)象的 matcher 方法來獲得一個(gè) Matcher 對(duì)象。
PatternSyntaxException 對(duì)象是一個(gè)未檢查異常,指示了正則表達(dá)式中的一個(gè)語(yǔ)法錯(cuò)誤。
使用的流程可以分為下面幾個(gè)步驟
Pattern的compile靜態(tài)方法獲取pattern對(duì)象
pattern調(diào)用自身的matcher方法返回Matcher對(duì)象matcher
matcher對(duì)象通過find,matches,lookingAt等方法進(jìn)行匹配
下面是個(gè)示例,要找到匹配ae,be,de,he之中的任意一個(gè)
package?com.hldh.river.regex;
import?java.util.regex.Matcher;
import?java.util.regex.Pattern;
/**
*?Created?by?liuhj?on?2016/1/5.
*?本例用于測(cè)試JDK1.7?中的Matcher和Pattern
*
*?使用時(shí)主要是Pattern編譯正則,Matcher用來匹配字符串
*/
public?class?AppTest?{
public?static?void?main(String?args[]){
String?regexStr?=?"[abdh]e";
String?targetStr?=?"hello?world";
//獲取Pattern對(duì)象
Pattern?pattern?=?Pattern.compile(regexStr);
//?定義一個(gè)matcher用來做匹配
Matcher?matcher?=?pattern.matcher(targetStr);
if?(matcher.find())?{
System.out.println(matcher.group());
}
}
}
輸出結(jié)果
he
是不是很簡(jiǎn)單,主要的難點(diǎn)還是在正則表達(dá)式的掌握上,API很好理解
還有一個(gè)點(diǎn)我覺得需要說明一下,就是group,正則表達(dá)式里有個(gè)分組的概念,比如說“^([abdh]e)(\d+)$”這里面就是兩個(gè)分組,對(duì)應(yīng)API里的group(int group),參數(shù)里是2的話就對(duì)應(yīng)匹配(\d+),參數(shù)是1的話對(duì)應(yīng)匹配([abdh]e),參數(shù)0是系統(tǒng)默認(rèn),表示匹配整個(gè)串。
使用group就可以把匹配到的字符竄捕獲。
Matcher中find方法是匹配字符串中的一部分,matches匹配整個(gè)字符串,所以啊你看表單驗(yàn)證都是用的matches方法。
總結(jié)
以上是生活随笔為你收集整理的java正则表达式爬虫_Java简单爬虫系列(3)---正则表达式和Java正则API的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: labview连接mysql数据库_la
- 下一篇: java美元兑换,(Java实现) 美元