分析正则中的匹配方法

                                 分析正则中的匹配方法

开发工具与关键技术:RegexBuddy 4 正则匹配
作者:李国旭
撰写时间:2019年4月20日

在学习正则表达式中,刚开始的时候觉得好难,慢慢的发现它挺好玩的;因为它可以把你想要的东西给你匹配出来,所以说这正则表达式其实并不难。举个例子,单个匹配和匹配纯文本是最简单的,特别是对新学的人来说。下面我们来看一下它的概念以及他的用法!
概念:正则表达式是对字符串操作的一种逻辑公式,就是事先定义好的一些特定字符、及些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。它的作用:验证、搜索和替换

实例(1):提取所有的P标签
在这里插入图片描述
<p.+(?=p>)p>这句的匹配的意思是:先匹配这<p的开始位置“.”这个点的意思就是匹配出除换行符以外的任意字符,“+”重复一次或更多次,然后用零宽先行断言匹配这p>的前面内容的结束位置再加上p>这样就可以把所有的p标签匹配出来了,方法有很多种。在单个匹配中:匹配一个位置的字符,主要就是为了一些元字符的使用,那么这里需要注意的是:在中括号中,特殊的代码不会被解释成其他意义

断言又分为四大种类:
(1)零宽先行断言(?=exp):零宽先行断言,它匹配文本中的某些位置,这些位置的后面能匹配给定的后缀exp。
(2)(?<=exp):零宽后行断言,它匹配文本中的某些位置,这些位置的前面能给定的前缀匹配exp。
(3)(?!exp):零宽负向先行断言,只会匹配后缀exp不存在的位置。
(4)(?<!exp):零宽负向后行断言来查找前缀exp不存在的位置

实例(2):匹配p标签里面所有style的样式
在这里插入图片描述
首先,先获取style=的开始位置,“.”这个点也是匹配出除换行符以外的任意字符;这里我用了贪婪与懒惰,正则表达式中默认是贪婪型的,这个行为的意思就是说匹配尽可能多的字符,而懒惰呢?就是跟它相反也就是尽可能少的字符。前提是只要前面的是重复的元字符都可以转为懒惰的匹配方法,只需要在他后面加上一个问号“?”上面的“+?”的意思是重复一次或更多次,但尽可能少重复的匹配,后面的问号是匹配exp前面的到这个引号的结束位置,然后再加上一个引号这样就可以匹配这个style的样式
我们既然可以在HTML、VS代码里面注释,当然也可以在正则表达式里面写注释;然而,它这里的注释只是让人们更好的看你的正则表达式代码“(?#注释)”这个类型的注释不会对我们的正则表达式的代码产生任何的影响,写注释都是个人的习惯性。

那么接下来我给大家介绍另一个通用的匹配方法是来自于JavaScript的参考手册里面的,它是这样描述:其实在RegExp的这个模式匹配方法还有String的模式匹配方法中,有一个的通用的匹配方法那就是exec();使用起来比RegExp.test()、String.search()、String.replace()和String.match()都复杂。

注明:下图来自JavaScript参考手册
在这里插入图片描述
缺点:就是他在在JScript 3.0中,exec()不能正确地使用和设置属性lastIndex,因此这时不能将全局模式的exec()用于循环中,就像上面那个例子所示的一样。
exec()将检索字符串string,从中得到与正则表达式regexp相匹配的文本。如果exec()找到了匹配的文本,它就会返回一个结果数组。否则,返回null。这个返回数组的第0个元素就是与表达式相匹配的文本。第1个元素是与regexp的第一个子表达式相匹配的文本(如果存在)。第2个元素是与regexp的第二个子表达式相匹配的文本,以此类推。通常,数组的length属性声明的是数组中的元素个数。除了数组元素和length属性之外,exec()还返回两个属性。index属性声明的是匹配文本的第一个字符的位置。input属性指的就是string。在调用非全局RegExp对象的exec()方法时,返回的数组与调用方法String.match()返回的方法相同。
在调用非全局模式的exec()方法时,它将进行检索,并返回上述结果。不过,当regexp是一个全局正则表达式时,exec()的行为就稍微复杂一些。它在regexp的属性lastlndex指定的字符处开始检索字符串string。当它找到了与表达式相匹配的文本时,在匹配之后,它将把regexp的lastlndex属性设置为匹配文本的第一个字符的位置。这就是说,可以通过反复地调用exec()方法来遍历字符串中的所有匹配文本。当exec()再也找不到匹配的文本时,它将返回null,并且把属性lastlndex重置为0。如果在另一个字符串中完成了一次模式匹配之后要开始检索新的字符串,就必须手动地把lastlndex属性重置为0。
注意:无论regexp是否是全局模式,exec()都会将完整的细节添加到它返回的数组中。这就是exec()和String.match()的不同之处,后者在全局模式下返回的信息要少得多。事实上,在循环中反复地调用exec()方法是惟一种获得全局模式的完整模式匹配信息的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值