![网络数据采集技术: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=1739406067-0CIKbUZf3PvL9Td3DjcakRJuOvmvEOB9-0-d2ed2abd4f73edcd8e61b1404b364f89)
第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=1739406067-8rZuk4fEOvxtG9WEGL1ki233OyVa6XZw-0-4cc84815e780266fb33a06805ddced35)
另外,分解某字符串也常使用正则表达式,如将字符串“正则表达式-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=1739406067-k55RFAIz2ddBb8SsEkl099drWSq1GswA-0-cfbfd6dfeb4d735165cf32df333f6798)
表2.3列举了常用元字符以及它们的正则表达式写法。
表2.3 常用元字符及其含义
![](https://epubservercos.yuewen.com/CDDCA8/18096059701207306/epubprivate/OEBPS/Images/37607_40_04.jpg?sign=1739406067-nQyteazastHSvZlpfo2MeaWWtP6Rneh7-0-b1bf32dda4d3e72da86c69c0ddf22a64)
续表
![](https://epubservercos.yuewen.com/CDDCA8/18096059701207306/epubprivate/OEBPS/Images/37607_41_01.jpg?sign=1739406067-F6jRjUMuFVUpKMX56lqUnhI78FQ9wjtd-0-76547c08211de27402d96504afc26c66)
在正则表达式中,常用方括号括起若干字符表示一个元字符,该元字符匹配的是括号内的任意一个字符。例如,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=1739406067-GJMZuAxoIXhiMVRdw9nqaAZdiu4TuFmd-0-6a761d2418e21b78387a4ed9133fc393)
程序2-19演示了表2.4中元字符的使用,图2.19所示为该程序的输出结果。
程序2-19
![](https://epubservercos.yuewen.com/CDDCA8/18096059701207306/epubprivate/OEBPS/Images/37607_41_03.jpg?sign=1739406067-Huql7jZIQuUgvYUM1UWSCo7FoXAjRi3Y-0-8149c476a85526066acd8e6e059ce21b)
![](https://epubservercos.yuewen.com/CDDCA8/18096059701207306/epubprivate/OEBPS/Images/37607_42_01.jpg?sign=1739406067-mmKRZkWA3zPd1ATlKYEI0Dv2z846qWGj-0-aabfff2f1df2ffc4715d7590845420d7)
![](https://epubservercos.yuewen.com/CDDCA8/18096059701207306/epubprivate/OEBPS/Images/37607_42_02.jpg?sign=1739406067-tMI7l0iIzFnukcCWJIwb5IxOZtISAIw9-0-f6006d98fecdf780de871e23cdc0d715)
图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=1739406067-7ipYK33QMAmNoAwDna24cIeFZasxdbD3-0-f9d445fb3011bd90a511819a9f7235ca)