![网络数据采集技术:Java网络爬虫实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/251/33831251/b_33831251.jpg)
2.9 正则表达式
正则表达式指由普通字符(如英文字母/数字等)以及特殊字符(如元字符“\D”)组成的字符串模式。正则表达式可以理解成一套模板,以这套模板可以匹配字符串。例如,从下面HTML片段中提取用户的id(75975500)。
![](https://epubservercos.yuewen.com/CDDCA8/18096059701207306/epubprivate/OEBPS/Images/37607_40_01.jpg?sign=1738858936-c74gIxN1U8r2ksAo7ciMiSRLEZz7x3QZ-0-9ed62587ff1493d8468412da8c920aea)
第5章会介绍一些HTML网页解析工具,如上面的HTML片段,使用Jsoup可直接解析得到字符串“//i.********.com.cn/75975500”。针对这个字符串,调用String类中的replaceAll(String regex, String replacement)方法,可成功剔除非数字字符(元字符“\D”表示非数字字符),进而提取用户id,如程序2-17所示。其中,replaceAll()方法的作用是替换字符串中的某段内容,参数regex为正则表达式,replacement为替换的内容。
程序2-17
![](https://epubservercos.yuewen.com/CDDCA8/18096059701207306/epubprivate/OEBPS/Images/37607_40_02.jpg?sign=1738858936-NIzLC08T3L27fIAyoKHAhFJneSymCq2v-0-2a54318ea62b4d2af703fa634efa7598)
另外,分解某字符串也常使用正则表达式,如将字符串“正则表达式-CSDN博客”分割为“正则表达式”和“CSDN博客”两个字符串,可利用String类中的split(regex)方法对原字符串进行操作,如程序2-18所示。其中,正则表达式“\\p{Punct}”匹配的是标点符号。
程序2-18
![](https://epubservercos.yuewen.com/CDDCA8/18096059701207306/epubprivate/OEBPS/Images/37607_40_03.jpg?sign=1738858936-hWpp7KMipzs5TQ30znUEt4KloWcEAIwE-0-9dac6cad7835d98d6536fc6c35f6ed86)
表2.3列举了常用元字符以及它们的正则表达式写法。
表2.3 常用元字符及其含义
![](https://epubservercos.yuewen.com/CDDCA8/18096059701207306/epubprivate/OEBPS/Images/37607_40_04.jpg?sign=1738858936-z5unoJWsOITGfsQYCyJaH3VRLeNaGal7-0-6965a7447acc3b3eecc9f165d363d434)
续表
![](https://epubservercos.yuewen.com/CDDCA8/18096059701207306/epubprivate/OEBPS/Images/37607_41_01.jpg?sign=1738858936-rLllyiFjwX0e9xZs0vWcGbfBHrlHqveU-0-f61313e6bb885be03effc079139c60f8)
在正则表达式中,常用方括号括起若干字符表示一个元字符,该元字符匹配的是括号内的任意一个字符。例如,String regex=“[abc]123”匹配的是“a123”,“b123”,“c123”。表2.4列举了一些包含方括号的元字符。
表2.4 包含方括号的元字符
![](https://epubservercos.yuewen.com/CDDCA8/18096059701207306/epubprivate/OEBPS/Images/37607_41_02.jpg?sign=1738858936-yehObDvf7fQJjmdU98RxXtCAU0OmEPi5-0-1e645718276400acac9ae310dc631bdb)
程序2-19演示了表2.4中元字符的使用,图2.19所示为该程序的输出结果。
程序2-19
![](https://epubservercos.yuewen.com/CDDCA8/18096059701207306/epubprivate/OEBPS/Images/37607_41_03.jpg?sign=1738858936-KlveC2A07h1EDBgwqRhcDYqu2UT7A3gZ-0-1abfcc00a9fdef13fb3329d6cbc06aab)
![](https://epubservercos.yuewen.com/CDDCA8/18096059701207306/epubprivate/OEBPS/Images/37607_42_01.jpg?sign=1738858936-yS73RQIfj2w9zZlAWR1prMTRBG86AuR2-0-906d7f78f5496cf9f6e8ce42cc80d535)
![](https://epubservercos.yuewen.com/CDDCA8/18096059701207306/epubprivate/OEBPS/Images/37607_42_02.jpg?sign=1738858936-UbDVef1H2OwNjGzPIqdvdj70Cg0WqI7y-0-df65b10ea09b54fa71700307a2dde779)
图2.19 程序2-19的输出结果
为了适应匹配的不确定性,正则表达式支持限定符的概念。限定符定义了某些元素可以出现的频次。例如,X{n,m}表示X出现n到m次的字符都可以匹配,使用“ac{1,3}”可以匹配“ac”、“acc”和“accc”。表2.5列举了常用的限定符。
表2.5 常用限定符
![](https://epubservercos.yuewen.com/CDDCA8/18096059701207306/epubprivate/OEBPS/Images/37607_42_03.jpg?sign=1738858936-hpIdkNR89Gn63nqUvgSy0C9aOWPToisx-0-33fca41a9a61576ebef76e2cb14d64ad)