编程环境

  • windows 10

  • eclipse

前言

  在一次Java程序设计课程中,在课堂上了解到了正则表达式,然后自己去百度了一番,发现正则表达式应用的范围还是比较广泛的,在Python爬虫爬取数据时候,也会用上正则表达式,所以决定花点心思去学习一下正则表达式。

正则表达式语法

  • 普通字符
正则表达式 说明
[123abc] 匹配[…]括号里边的所有字符,相当于匹配1或2或3或a或b或c, 等价于[1|2|3|a|b|c]
[^123abc] 匹配除了[…]之外的所有字符,相当于匹配除了1,2,3,a,b,c之外的所有字符
[a-z] 表示一个区间,匹配小写字母
[A-Z] 表示一个区间,匹配大写字母
[0-9] 表示一个区间,匹配0到9之间的数字
\d 匹配数字,等价于[0-9]
\D 匹配非数字,等价于[^0-9]
\w 匹配字母、数字或者下划线,等价于[a-zA-z0-9_]
\W 匹配非字母、非数字或者非下划线,\W相当于匹配\w的补集字符,等价于[^a-zA-z0-9_]

说明:\大写字母 和 \小写字母,匹配的字符内容是相反的,^代表取反的意思

  • 非打印字符
正则表达式 说明
\cx 匹配由x指明的控制字符。例如, \cM 匹配一个 control-M 或回车符。x 的值必须是26个字母
\f 匹配一个换页符
\n 匹配一个换行符
\r 匹配一个回车符
\t 匹配一个制表符
\v 匹配一个垂直制表符
\s 匹配所有的空白字符,等价于[\f\n\r\t\v]
\S 匹配所有非空白字符,等价于[^\f\n\r\t\v]

  说明:控制字符主要有LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(振铃)等,存在于Ascii码中的第0~31号及127号中。想了解更多关于控制字符的内容请点击这里

  • 特殊字符
正则表达式 说明
$ 匹配输入字符串的结尾位置,要匹配 $ 字符本身,请使用\$。
( ) 标记一个子表达式的开始和结束位置,要匹配这些字符,请使用 \( 和 \)
* 匹配前面的子表达式零次或多次,要匹配 * 字符,请使用 \*
+ 匹配前面的子表达式一次或多次,要匹配 + 字符,请使用 \+
. 匹配除换行符 \n 之外的任何单个字符,要匹配 . ,请使用 \.
[ 标记一个中括号表达式的开始。要匹配 [ ,请使用 \[
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符,要匹配 ? 字符,请使用 ?
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符
^ 匹配输入字符串的开始位置,当该符号在方括号表达式中使用时,匹配非方括号内容的字符,相当于取反,要匹配 ^ 字符本身,请使用 ^
{ 标记限定符表达式的开始,要匹配 {,请使用 \{
| 指明两项之间的一个选择,相当于或,要匹配 |,请使用 \
  • 限定字符
正则表达式 说明
{n} n 是一个非负整数,匹配确定的 n 次
{n,} n 是一个非负整数,至少匹配n 次
{n,m} m 和 n 均为非负整数,其中n <= m,最少匹配 n 次且最多匹配 m 次

正则表达式的应用

  • 实例1

  我们来讲一下比较有用的例子吧,拿html的标签页来举例子,假如说我们需要匹配html中a标签下的链接


import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Debug {public static void main(String[] args) {String html = "<a class=\"regex\" href=\"https://www.baidu.com/\">正则表达式</a>";String regex = "<a class=\"[a-z]+\" href=\"(.*?)\">(.*?)</a>";for (int i = 0; i < 3; i++) {String content = getContentByRegex(html, regex, i);System.out.println(content);}}public static String getContentByRegex(String html, String regex, int index) {String content = ""; // 如果没有匹配到, 则返回空字符串Pattern pattern = Pattern.compile(regex);Matcher match = pattern.matcher(html);if (match.find()) {content = match.group(index);}return content;}}

  解释说明一下上面的代码,html是我们获取到的网页源代码,regex就是我们写的正则表达式规则,可以看到的是,我在href=后边使用了 .*? ,.*? 指的是匹配除了换行之外的所有字符,在这个代码里边就是匹配href后边的整个链接(ps: .*? 在写在href双引号的里边), .*? 我个人觉得是比较常用的一种,简单好用。接下来就是调用自己写的函数来返回匹配的内容,其中match.find()是必不可少的,match.group(0)或者match.group()代表的是正则表达式规则的全部内容,match.group(1)代表的是第一个括号里边的内容,match.group(2)代表的是第二个括号里边的内容,依次类推。

代码的运行结果如下

<a class="regex" href="https://www.baidu.com/">正则表达式</a>
https://www.baidu.com/
正则表达式

  如果我们只需要href里边的链接,我们就只需要match.group(1)就可以了。

  • 实例2

  那如果我们想匹配网页上所有a标签下的链接的话,该怎么做呢?先上代码

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.List;
import java.util.ArrayList;public class Debug {public static void main(String[] args) {String html = "<a class=\"regex\" href=\"https://www.baidu.com/\">正则表达式\n</a>隔开两个a标签的内容\n<a class=\"regex\" href=\"https://blog.csdn.net/\">正则表达式\n</a>";String regex = "<a class=\"[a-z]+\" href=\"(.*?)\">(.*?)</a>"; // 正则表达式规则List<String> content = getContentByRegex(html, regex, 1);  // 获取到的内容System.out.println(content);   // 输出}public static List<String> getContentByRegex(String html, String regex, int index) {List<String> list = new ArrayList<>(); // 创建一个空列表Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);Matcher match = pattern.matcher(html);while (match.find()) {list.add(match.group(index));}return list;}}

  解释说明:因为我们需要匹配多个a标签下的链接,所以我们用列表来存储这些链接比较方便,对比上一个例子,会发现compile中多了一个Pattern.DOTALL, 原来 .*? 匹配的是除了换行之外的所有字符,使用DOTALL会把\n也当成一个普通字符,也就是说 .*? 也会匹配换行符;还有就是在getContentByRegex函数中用的是while (match.find()) 而不是if (match.find()),因为这里是有多个链接的,所有用的是while。

代码的运行结果如下

[https://www.baidu.com/, https://blog.csdn.net/]

我们来输出一下match.group(2),输出结果如下:

[正则表达式
, 正则表达式
]

会发现,也把 \n 符匹配了进去,所以输出时候文字后边会多了一个 \n ,这也就是使用DOTALL的原因,如果没有使用DOTALL则会匹配失败,返回的是空列表 [] 。

总结

  上述就是我对正则表达式的理解,讲到的内容可能偏少,不过都是比较实用的东西。希望这篇文章会对你有帮助,如果有什么问题欢迎在评论区提出。

Java 正则表达式,正则表达式匹配a标签下的链接,正则表达式基础相关推荐

  1. java中正则匹配字符串长度_Java中使用正则表达式校验字符串

    Java中使用正则表达式校验字符串 正则表达式是某一位伟大的数学家发明的,现在已经形成了一个ISO标准,这个标准和编程语言没有关系.至于具体谁发明的,怎么发明的,我也忘记了:). 正则表达式简单理解就 ...

  2. java 正则表达式 替换字符串img标签的路径_正则表达式和有限自动机的应用

    1. 为什么谈有限自动机时要谈正则表达式?原因是:正则表达式所匹配的所有字符串所构成的语言可以用有限自动机识别.根本原因是:正则集(正则表达式所匹配的所有字符串集合)是由右线性文法(3型文法)所产生的 ...

  3. python如何打出英文括号_用python的re(正则表达式)模块匹配英文环境下的括号

    在用re(正则表达式)模块匹配掉文本中的括号时,总是出现各种各样的问题,经过将近一个小时的摸索,终于找到了问题的所在. 案例: 将 txt = 'Linux系统安装 - 1.1(Av20994127, ...

  4. Python正则匹配HTML,python正则匹配html标签_Python爬虫常用正则表达式及HTML网页标签分析总结...

    这篇文章主要是介绍Python爬取网页信息时,经常使用的正则表达式及方法.它是一篇总结性文章,实用性比较大,主要解决自己遇到的爬虫问题,也希望对你有所帮助~ 当然如果会Selenium基于自动化测试爬 ...

  5. python正则匹配html标签_Python爬虫常用正则表达式及HTML网页标签分析总结

    这篇文章主要是介绍Python爬取网页信息时,经常使用的正则表达式及方法.它是一篇总结性文章,实用性比较大,主要解决自己遇到的爬虫问题,也希望对你有所帮助~ 当然如果会Selenium基于自动化测试爬 ...

  6. JAVA 截取字符串 获得img 标签中的 链接

    在存放文章的时候 图片另存地址 本地或者服务器 这样图片地址跟随 文章一起存到了数据库 截取图片的方法 public void test() {String str="<p>&l ...

  7. JS正则表达式字符匹配

    正则表达式字符匹配 这是阅读<JavaScript正则表达式迷你书>后整理的一些笔记. 正则表达式是匹配模式,要么匹配字符,要么匹配位置. 下面主要介绍匹配字符的情况,匹配位置的情况我也正 ...

  8. python正则表达式如何匹配“+”,“*”

    python正则表达式如何匹配"+","*","-" +,*,-在正则表达式匹配里面都是元字符有特殊含义: +表示匹配1个或多个 *表示匹配 ...

  9. iOS数据搜索技巧之【利用正则表达式进行匹配查找数据 】1、使用正则表达式对聊天记录的关键词进行监控 2、NSPredicate在正则表达式的应用

    文章目录 引言 I.[使用正则表达式对聊天记录的关键词进行监控] II iOS Predicate Format String Syntax [NSPredicate在正则表达式的应用] III 知识 ...

  10. Android-微博短链接正则表达式与特殊文本高亮

    做新浪微博第三方客户端时,对正文内容的特殊字符(如网页短链接.##话题.@人名等)进行高亮变色,需要用到以下几个正则表达式. 1 /**微博短链接正则表达式*/ 2 static final Stri ...

最新文章

  1. SAP MM Transportation of PR Release Strategy with Classification
  2. 机器学习(MACHINE LEARNING)MATLAB进行概率统计分析
  3. 事件驱动模式--Reactor
  4. 自学python 知乎-马哥教育官网-专业Linux培训班,Python培训机构
  5. Linux中断(interrupt)子系统之五:软件中断(softIRQ)
  6. 全球互联网领域第一人!马云获福布斯终身成就奖
  7. XPath 轴 Axes
  8. axure操作回复_Axure8.0基础教程(31-40)新手必须掌握的基础操作
  9. (西瓜书)机器学习(周志华)书目录
  10. linux版udp发包工具,packet sender下载-Packet Sender(UDP/TCP网络测试工具)下载 v7.0.5官方版--pc6下载站...
  11. 【丁丁历险记】ESP8266/ESP32做微信遥控语音识别
  12. R语言---ggplot绘图
  13. 中班音乐计算机反思,中班音乐游戏打字机教案反思
  14. 各种主流浏览器内核引擎的对比分析
  15. 加速度传感器 mag_将电话连接到没有辅助扬声器mag的汽车立体声
  16. 深信服信锐 技术支持(网络工程师)
  17. html设置右缩进,word左右缩进怎么设置
  18. adb命令查看手机电量_使用adb命令查看电池电量信息
  19. latex中图片和文字并列排放讲解
  20. 最新视频打赏系统全开源+附教程/亲测可用

热门文章

  1. 威纶触摸屏485轮询通讯_威纶触摸屏Modbus TCP\RTU\ASCII通信视频教程
  2. 计算机精品在线开放课程申报书,精品在线开放课程申报书.doc
  3. 简单的C语言程序示例
  4. 阿克曼(Ackermann)函数
  5. 5分钟教小白通过ipv6远程访问白群晖
  6. 两种方式对线性规划问题求解详细步骤:【Excel 2016】与【Python 编程】
  7. 2020.07.01-07.15学习小结
  8. PreferenceScreen1
  9. MSDTC不可用解决办法
  10. 课程设计(飞机订票系统) 超全