正则表达式语法详解

正则表达式的发展

1956 年, 一位叫 Stephen Kleene 的数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为"神经网事件的表示法"的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为"正则集的代数"的表达式,因此采用"正则表达式"这个术语。

随后,发现可以将这一工作应用于使用 Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson 是 Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的 qed 编辑器。

应用领域

目前,正则表达式已经在很多软件中得到广泛的应用,包括 *nix(Linux, Unix等)、HP 等操作系统,PHP、C#、Java 等开发环境,以及很多的应用软件中,都可以看到正则表达式的影子。

语法讲解

我们先学习下正则表达式的语法。

从下面的HTML文件中去找到标题和配图,并展示出来。

<!doctype html><html><head><meta charset="UTF-8"><meta name="Generator" content="EditPlus®"><meta name="Author" content=""><meta name="Keywords" content=""><meta name="Description" content=""><title>太阳花</title></head><body><img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1583316055260&di=959e455d95596926fb9eaf132b94fae6&imgtype=0&src=http%3A%2F%2Fa3.att.hudong.com%2F68%2F61%2F300000839764127060614318218_950.jpg"><p>美丽的照片</p></body></html>

这里会有人觉得这个很搞笑,直接查title和img就可以了。但是在非常复杂的HTML界面中,光靠JAVA带的查title和img就不够了,甚至一些文本自身还会带title和img,这会带来很大的影响。

什么是正则表达式

正则表达式 是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符",)组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

普通字符

普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写A ~ Z和小写字母a ~ z、所有数字0~9、所有标点符号和一些其他符号。

非打印字符

非打印字符也可以是正则表达式的组成部分。下表列出了表示非打印字符的转义序列:

字符描述
\cx匹配由x指明的控制字符。
\f匹配一个换页符。等价于 \x0c 和 \cL。
\n匹配一个换行符。等价于 \x0a 和 \cJ。
\r匹配一个回车符。等价于 \x0d 和 \cM。
\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t匹配一个制表符。等价于 \x09 和 \cI。
\v匹配一个垂直制表符。等价于 \x0b 和 \cK。

特殊字符

所谓特殊字符,就是一些有特殊含义的字符。比如* 就代表着所有的字符,如果想要查找,则需要通过 \ * 来表达。

许多元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符 () 放在它们前面。下表列出了正则表达式中的特殊字符:

特别字符描述
$匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 字符本身,请使用 $。
( )标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。
*匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 *。
+匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +。
.匹配除换行符 \n之外的任何单字符。要匹配 .,请使用 \。
[标记一个中括号表达式的开始。要匹配 [,请使用 [。
?匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 ?。
\将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 ‘\’ 匹配 “”,而 ‘(’ 则匹配 “(”。
^匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 ^。
{标记限定符表达式的开始。要匹配 {,请使用 {。

限定符

限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*或+或?或{n}或{n,}或{n,m}共6种。
正则表达式的限定符有:

字符描述
*匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。
+匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
?匹配前面的子表达式零次或一次。例如,“do(es)?” 可以匹配 “do” 或 “does” 中的"do" 。? 等价于 {0,1}。
{n}n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,}n 是一个非负整数。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。‘o{1,}’ 等价于 ‘o+’。‘o{0,}’ 则等价于 ‘o*’。
{n,m}m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,“o{1,3}” 将匹配 “fooooood” 中的前三个 o。‘o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。

定位符

定位符使您能够将正则表达式固定到行首或行尾。它们还使您能够创建这样的正则表达式,这些正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾。

定位符用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界。
正则表达式的限定符有

项目描述
^匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配。
$匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 \n 或 \r 之前的位置匹配。
\b匹配一个字边界,即字与空格间的位置。
\B非字边界匹配。

注意:不能将限定符与定位点一起使用。由于在紧靠换行或者字边界的前面或后面不能有一个以上位置,因此不允许诸如 ^* 之类的表达式。

元字符

字符描述
\将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。
^匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。
$匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。
*匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。
+匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
?匹配前面的子表达式零次或一次。例如,“do(es)?” 可以匹配 “do” 或 “does” 中的"do" 。? 等价于 {0,1}。
{n}n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,}n 是一个非负整数。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。‘o{1,}’ 等价于 ‘o+’。‘o{0,}’ 则等价于 ‘o*’。
{n,m}m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,“o{1,3}” 将匹配 “fooooood” 中的前三个 o。‘o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。
?当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 “oooo”,‘o+?’ 将匹配单个 “o”,而 ‘o+’ 将匹配所有 ‘o’。
.匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\n]’ 的模式。
(pattern)匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 9 属性。要匹配圆括号字符,请使用 ‘(’ 或 ‘)’。
(?:pattern)匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 “或” 字符 (
(?=pattern)正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows (?=95
(?!pattern)负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如’Windows (?!95
xy
[xyz]字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。
[^xyz]负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’。
[a-z]字符范围。匹配指定范围内的任意字符。例如,’[a-z]’ 可以匹配 ‘a’ 到 ‘z’ 范围内的任意小写字母字符。
[^a-z]负值字符范围。匹配任何不在指定范围内的任意字符。例如,’[^a-z]’ 可以匹配任何不在 ‘a’ 到 ‘z’ 范围内的任意字符。
\b匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。
\B匹配非单词边界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。
\cx匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。
\d匹配一个数字字符。等价于 [0-9]。
\D匹配一个非数字字符。等价于 [^0-9]。
\f匹配一个换页符。等价于 \x0c 和 \cL。
\n匹配一个换行符。等价于 \x0a 和 \cJ。
\r匹配一个回车符。等价于 \x0d 和 \cM。
\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t匹配一个制表符。等价于 \x09 和 \cI。
\v匹配一个垂直制表符。等价于 \x0b 和 \cK。
\w匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。
\W匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]’。
\xn匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,’\x41’ 匹配 “A”。’\x041’ 则等价于 ‘\x04’ & “1”。正则表达式中可以使用 ASCII 编码。
\num匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,’(.)\1’ 匹配两个连续的相同字符。
\n标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
\nm标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
\nml如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
\un匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。

问题解答

我们需要查title和img相关数据,那么我们先来分析一下功能需求。

title一般在HTML文件中由标题这样的格式组成,并且前后应该都只检测一次,该使用?字段,中间title内容可以为一切内容,那么使用使用.。然后title内容为一个或多个字符,使用*
那么正则表达式可以表示为:

<title>.*?</title>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564923.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql数据库(9):常用查询的例子

目录 &#xff08;1&#xff09;可以使用以下语句创建示例表 &#xff08;2&#xff09;执行语句后&#xff0c;查看表所包含内容 &#xff08;3&#xff09;列的最大值 &#xff08;4&#xff09;拥有某个列的最大值的行 方法一&#xff1a; 方法二&#xff1a; &#x…

树莓派 小屏幕_树莓派学习手动积累(1)

树莓派4B到手&#xff0c;满怀激动地拆开包装&#xff0c;准备大展拳脚。Raspberry Pi(中文名为“树莓派”,简写为RPi&#xff0c;(或者RasPi / RPI)是为学习计算机编程教育而设计)&#xff0c;只有信用卡大小的微型电脑&#xff0c;其系统基于Linux。随着Windows 10 IoT的发布…

正则表达式的匹配规则

字面量字符和元字符 大部分字符在正则表达式中&#xff0c;就是字面的含义&#xff0c;比如 /a/ 匹配 a&#xff0c; /b/ 匹配b。这种只表示它字面量含义的被称为字面量字符。 除了字面量&#xff0c;还有一些字符有特殊含义&#xff0c;不代表字面意思&#xff0c;被称为元字…

mysql数据库(10):数据 备份

目录 &#xff08;1&#xff09;备份某个数据库下的固定某些表 &#xff08;2&#xff09;对单个或多个库进行完全备份 &#xff08;3&#xff09;对所有库进行完全备份&#xff08;建立all.sql文件) &#xff08;1&#xff09;备份某个数据库下的固定某些表 目标&#xff…

华为5720设置静态路由不通_静态路由理论知识详解

一、简介静态路由是一种需要管理员手工配置的特殊路由。静态路由在不同网络环境中有不同的目的&#xff1a;当网络结构比较简单时&#xff0c;只需配置静态路由就可以使网络正常工作。在复杂网络环境中&#xff0c;配置静态路由可以改进网络的性能&#xff0c;并可为重要的应用…

正则表达式的运算符优先级

正则表达式从左到右进行计算&#xff0c;并遵循优先级顺序&#xff0c;这与算术表达式非常类似。 相同优先级的从左到右进行运算&#xff0c;不同优先级的运算先高后低。下表从最高到最低说明了各种正则表达式运算符的优先级顺序&#xff1a; 运算符 描述 \ 转义符 (), (?:), …

mysql数据库(11):恢复数据

目录 (1)先登录 (2)查看数据库有哪些 (3)新建一个空表text (4)删除数据库yang (5)恢复数据库 (1)先登录 mysql -h localhost -u root -p (2)查看数据库有哪些 show databases; 返回&#xff1a; (3)新建一个空表text create database text; 返回&#xff1a; (4)删除…

c语言sin程序怎么写_用数控铣床加工六芒星,程序应该怎么写?

就用D50MM圆柱毛丕&#xff0c;D10的铣刀粗略写一个&#xff0c;仅代表个人观点哈~主程序:O0000G17G40G49G80G90G54G0G90G54X27.Y-12.5Z50.S2000M3Z3.G1Z0.F300M98P50001G0Z50.M05M30子程序&#xff1a;O0001G91G1Z-2.F300G90G41D1G1X21.65Y-12.50F300G1X7.22X0.Y-25.X-7.22Y-1…

Java数字格式化

数字的格式在解决实际问题时使用非常普遍&#xff0c;这时可以使用 DedmalFormat 类对结果进行格式化处理。例如&#xff0c;将小数位统一成 2 位&#xff0c;不足 2 位的以 0 补齐。 DecimalFormat 是 NumberFormat 的一个子类&#xff0c;用于格式化十进制数字。DecimalForm…

mysql查询三个月内的_如何在三个月内自学攻克雅思6.5分?

新西兰留学移民经历分享-进行时(3)编者按&#xff1a;选新西兰留学前&#xff0c;看过很多博主的帖子&#xff0c;让一个从没到访过新西兰的我有了多一些了解和规划。现在也希望能把自己的经历分享给大家&#xff0c;同时作为人生中比较大的一个决定&#xff0c;想用文字记录全…

万字mysql数据库图文教程

目录 一、前言 ⭐四万字入门教程⭐ 二、连接与断开服务器 三、输入与查询 四、使用数据库 五、创建并选择数据库 六、创建表 七、将数据填入表中 八、从表中检索信息 九、获得数据库和表中信息 十、常用查询例子 十一、数据库备份 十二、数据库恢复 一、前言 本篇…

Java大数字运算

在 Java 中提供了用于大数字运算的类&#xff0c;即 java.math.BigInteger 类和 java.math.BigDecimal 类。这两个类用于高精度计算&#xff0c;其中 BigInteger 类是针对整型大数字的处理类&#xff0c;而 BigDecimal 类是针对大小数的处理类。 BigInteger 类 如果要存储比 …

MySQL从入门到精通详细教程

目录 前言 ⭐集合4万字基础教程⭐ 一、SQL详细教程 二.mysql入门详细教程 ⭐python mysql 图文教程⭐ 一、MySQL和python MySQL安装教程 二、Python MySQL入门连接 三、Python MySQL创建表 四、Python MySQL插入表 五、Python MySQL选择 六、Python MySQL查询在哪里…

batchnorm and relu_日本AND荷重传感器

【广州兰瑟】对射式检测方式的发和接相互对射安装&#xff0c;日本AND荷重传感器的光直接对准。当被测物挡住光束时&#xff0c;日本AND荷重传感器传感器输出产生变化以指示被测物被检测到。式是早使用的一种光电检测模式。谢谢如有传感器/仪表/模块/放大器/接线盒...咨询可搜索…

Java时间日期的处理

在 Java 中获取当前时间&#xff0c;可以使用 java.util.Date 类和 java.util.Calendar 类完成。其中&#xff0c;Date 类主要封装了系统的日期和时间的信息&#xff0c;Calendar 类则会根据系统的日历来解释 Date 对象。 Date 类 Date 类表示系统特定的时间戳&#xff0c;可…

R语言基础入门(10)之矩阵和数组

目录 1.矩阵 创建矩阵 查看矩阵的行与列数 转置 2.矩阵子集 3.矩阵行列命名 4.命名后取子集 5.逻辑下标取子集 6.正整数向量的矩阵取子集 7.返回对角线向量 8.创建单位矩阵 9.cbind() 和 rbind() 函数 10. 矩阵运算 10.1 四则运算 10.2 矩阵乘法 10.3 向量与…

foxit phantom pdf 7.3_Jpeg to Pdf Converter 3000批量将图片转为PDF的方法

Jpeg to Pdf Converter 3000是一款非常优秀的图片转PDF软件&#xff0c;该软件界面清爽美观&#xff0c;用户使用该软件&#xff0c;可以快速的将JPG图片转换为PDF文件&#xff0c;而且转换的质量非常高。我们在日常的办公生活中&#xff0c;很多时候为了使图片在传输过程中不被…

Java日期格式化

格式化日期表示将日期/时间格式转换为预先定义的日期/时间格式。例如将日期“Fri May 18 15:46:24 CST2016” 格式转换为 “2016-5-18 15:46:24 星期五”的格式。 在 Java 中&#xff0c;可以使用 DateFormat 类和 SimpleDateFormat 类来格式化日期。 DateFormat 类 DateFor…

变异系数法之matlab

目录 1.简介 2.算法原理 2.1 指标正向化 2.2 数据标准化 2.3 计算变异系数 2.4 计算权重以及得分 3.实例分析 3.1 读取数据 3.2 指标正向化 3.3 数据标准化 3.4 计算变异系数 3.5 计算权重 3.6 计算得分 完整代码 1.简介 变异系数法(Coefficient of variation …

ui automator viewer 怎么获取界面名_ui交互设计怎么样

ui交互设计怎么样&#xff0c;中天软件培训拥有实力雄厚的师资团队&#xff0c;全部是由国内行业知名专家&#xff0c;全职资深项目讲师、知名企业兼职项目导师组成。ui交互设计怎么样&#xff0c; 一般来说&#xff0c;交互设计师的工作内容就到此为止了。顾名思义&#xff0c…