![网络数据采集技术: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=1738886731-2VUxcPmoWv06A9EcFznPr9nj5BptYml2-0-9cf3f41fffac35d9b0d4a12247d978eb)
第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=1738886731-4m2zHN2JYgwvXrcXDCswWvwuV0f4L83y-0-8111c214bc12ffdd0c04d448264b2194)
另外,分解某字符串也常使用正则表达式,如将字符串“正则表达式-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=1738886731-1Ya9RldvAjonwvsow41ypYcax3ljoaRj-0-4a75b8265420bc0babc7abea8dac6529)
表2.3列举了常用元字符以及它们的正则表达式写法。
表2.3 常用元字符及其含义
![](https://epubservercos.yuewen.com/CDDCA8/18096059701207306/epubprivate/OEBPS/Images/37607_40_04.jpg?sign=1738886731-TSYCU3NR0cUABwqNOyoujNO84Rf88RLZ-0-9882525663002e6352e1e20bfc48dc45)
续表
![](https://epubservercos.yuewen.com/CDDCA8/18096059701207306/epubprivate/OEBPS/Images/37607_41_01.jpg?sign=1738886731-DCBJtI3ecSUL5DWavcP06mQ5rj47ksPt-0-ffdb0e8654a38ad20e91d73228e30a1d)
在正则表达式中,常用方括号括起若干字符表示一个元字符,该元字符匹配的是括号内的任意一个字符。例如,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=1738886731-S7Ob04ljUE88FnLmdCyZHiMUsBY6ZfMw-0-c788498cc00d9c5a590a20c419e7b9d2)
程序2-19演示了表2.4中元字符的使用,图2.19所示为该程序的输出结果。
程序2-19
![](https://epubservercos.yuewen.com/CDDCA8/18096059701207306/epubprivate/OEBPS/Images/37607_41_03.jpg?sign=1738886731-FgAq8EBKOkQWyMWCsornlyqT7f3wuhzl-0-e30b7f3b20a52c373b0b22963f6d05e9)
![](https://epubservercos.yuewen.com/CDDCA8/18096059701207306/epubprivate/OEBPS/Images/37607_42_01.jpg?sign=1738886731-hi5cguK4VOlLlVI59rZqxZGTj9wZ9PoI-0-2ac44126173b1ba6f7dc60df65f6a675)
![](https://epubservercos.yuewen.com/CDDCA8/18096059701207306/epubprivate/OEBPS/Images/37607_42_02.jpg?sign=1738886731-crU4OaNq1qr1awzAbguDfdkJiwDyir7N-0-0aebf4ff56ee002d1ed6d2ca95039bf8)
图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=1738886731-3UEknwf3VZUFURaNaBou82ELKfRsJjaP-0-bfe0a12bd5b6d010ac70fd35a923a187)