正则表达式学习(入门)

本文详细介绍了正则表达式的基础知识,包括元字符的使用、重复限定符、分组技巧,以及正向和负向的先行、后行断言。还讲解了捕获组、非捕获组、反向引用以及贪婪与非贪婪匹配的概念。通过实例解析了如何匹配手机号码、处理字符串中的特定内容以及查找重复模式。对于理解和应用正则表达式具有指导意义。
摘要由CSDN通过智能技术生成

正则表达式

正则基础知识点:

1、元字符:元字符是构造正则表达式的一种基本元素

常用的元字符

在这里插入图片描述
在这里插入图片描述
2、重复限定符:把字符串重复部分用合适的限定符替代

在这里插入图片描述
在这里插入图片描述
3、分组

  • 限定符是作用在与他左边最近的一个字符,如果想要ab同时被限定:正则表达式中用小括号来分组,也就是括号中的内容作为一个整体,因此当我们需要匹配多个ab时,可以这样使用:**^(ab)***表示匹配字符串中包含0到多个ab开头。

4、转义
如果要匹配到字符串本身就含小括号,为了避免冲突,正则提供了转义的方式,也就是要把这些元字符、限定符或者关键字转义成普通的字符,做法很简单,就是在要转义的字符前面加个斜杠‘ \ ’
例如:要匹配以(ab)开头:^( \ (ab \ ))*

5、条件或
手机号匹配:国内号码都来自三大网、他们都有自己的号段,所以若要匹配对应的号码段,应该有一些并列条件,也就是“或”。

正则用符号“|”来表示或,也叫做分支条件,当满足正则里的分支条件的任何一种条件时,都会当成是匹配成功。
例如: ^(130 | 131 | 132 | 155 | 156 | 185 | 186 | 145 | 176 )\d{8}$

6、区间
正则提供一个元字符中括号 [] 来表示区间条件
例如:
·限定0到9 可以写成[0-9]
·限定A到Z 写成[A-Z]
·限定某些数字[165]
·上面匹配手机号码的正则表达式我们也可以这样进行简化: ^((13[0-2]) | 15[5-6] | 18[5-6] | 145 | 176 )\d{8}$

7、零宽断言:

断言:正则中的断言,就是说正则可以指明在指定的内容前面或后面会出现满足指定规则的内容,意思是正则也可以像人类那样断定什么什么,比如“ss1aa2bb3”,正则可以用断言找出aa2前面有bb3,也可以找出aa2后面有ss1.

零宽:就是没有宽度,在正则中,断言只是匹配位置,不占字符,也就是说,匹配结果里是不会返回断言本身。

举个例子:假设要使用爬虫抓取csdn里的文章阅读量。通过查看源代码可以看到文章阅读量这个内容是这样的结构
在这里插入图片描述
其中只有641这个是变量,也就是说不同文章不同的值,当我们拿到这个字符串时,需要获得这里边的‘641’有很多种办法,但如果正则应该怎么匹配呢?

正向先行断言(正前瞻)
·语法:(?=pattern)
·作用:匹配pattern表达式的前面内容,不返回本身。

要取出阅读量,在正则表达式中就意味着要能匹配到 < /span > 前面的数字内容,按照上面👆所说的正向先行断言可以匹配表达式前面的内容,那意思就是(?=< /span >)就可以匹配到前面的内容了。
在这里插入图片描述

正向后行断言(正后顾):
·语法:(?<=pattern )
·作用: 匹配pattern表达式的后面的内容不返回本身。

在这里插入图片描述

负向先行断言(负前瞻)
·语法:(?!pattern)
·作用:匹配非pattern表达式的前面内容,不返回本身。

有正向也有负向,负向在这里其实就是非的意思。举个例子:比如有一句“我爱祖国,我是祖国的花朵” 现在要找到不是 ‘的花朵’ 前面的祖国,用正则表达式就可以这样写:

                   祖国(?!的花朵)

负向后行断言(负后顾)
·语法:(?<!pattern)
·作用:匹配非pattern表达式的后面内容,不返回本身。

8、捕获和非捕获

捕获组:匹配子表达式的内容,把匹配结果保存到内存中用数字编号或显示命名的组里,以深度优先进行编号,之后可以通过序号或名称来使用这些匹配结果。

根据命名方式的不同又可以分为两种组:
1.数字编号捕获组:
语法:(exp)

解释:从表达式左侧开始,每出现一个左括号和它对应的右括号之间的内容为一个分组,在分组中,第0组为整个表达式,第一组开始为分组。
比如固定电话的:020-85653333
他的正则表达式为:(0\d{2})-(\d{8})
按照左括号的顺序,这个表达式有如下分组:
在这里插入图片描述
2. 命名编号捕获组:
语法:(?< name >exp)
解释:分组的命名由表达式中的name指定
比如区号也可以这样写:
(?< qvhao >\0\d{2})-(?< haoma >\d{8})
按照左括号的顺序,这个表达式有如下分组:

在这里插入图片描述
3. 非捕获组:
语法:(?:exp)
解释:和捕获组刚好相反,它用来标识那些不需要捕获的分组,说的通俗一点,就是你可以根据需要去保存你的分组。

比如上面的正则表达式,程序不需要用到第一个分组,那就可以这样写:
(?:\0\d{2})-(\d{8})
在这里插入图片描述

9、反向引用
我们知道:捕获会返回一个捕获组,这个分组是保存在内存中,不仅可以在正则表达式外部通过程序进行引用,也可以在正则表达式内部进行引用,这种引用方式就是反向引用。

根据捕获组的命名规则,反向引用可分为:
1、数字编号组反向引用:\k 或 \number
2、命名编号组反向引用:\k 或 ‘name’

它的作用主要是用来查找一些重复的内容或者做替换指定字符

举个例子:
比如要查找一串字母“aabbbbgbddesddfiid"里成对的字母
思路:
1)匹配到第一个字母
2)匹配下一个字母,检查和上一个字母是否一样
3)如果一样,则匹配成功,否则失败

思路中匹配下一个字母时,需要用到上一个字母,如何记住上一个字母,就要用到“捕获”,我们可以利用捕获把上一个匹配成功的内容作为本次匹配的条件。

首先匹配一个字母:\w
我们需要做成分组才能捕获,因此写成这样:(\w)
在这里插入图片描述

10、贪婪和非贪婪

贪婪匹配:当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符,这种匹配方式叫做贪婪匹配。

特性:一次性读入整个字符串进行匹配,每当不匹配就舍弃最右边一个字符,继续匹配,依次匹配和舍弃(这种匹配和舍弃的方式也叫做回溯),直到匹配成功或则把整个字符串舍弃完为止,因此它是一种最大化的数据返回,能多不会少。

前面的重复限定符,其实就是贪婪量词,比如表达式:\d{3,6}
在这里插入图片描述
在这里插入图片描述

懒惰(非贪婪)

懒惰匹配:当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能少的字符,这种匹配方式叫做懒惰匹配。

特性:从左到右,从字符串的最左边开始匹配,每次试图不读入字符匹配,匹配成功,则完成匹配,否则读入一个字符再匹配,依此循环(读入字符、匹配)直到匹配成功或者把字符串的字符匹配完为止。

在这里插入图片描述

11、反义

前面说到元字符的都是要匹配什么,如果想反着来,不想匹配某些字符,正则也提供了一些常用的反义元字符:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值