正则表达式零宽断言的基本使用方法

注:此次只涉及零宽断言,不涉及负向零宽断言;

定义

零宽断言:零宽断言是正则表达式中的一种方法,正则表达式在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。(此处度娘)

零宽断言又分为正向零宽断言和反向零宽断言(名字有多种说法,都可度娘了解,下面的理解示例,在百科中也可查看到);

正向零宽断言:表达式为-(?=expression);作用:即匹配语句之前的数据:理解示例:

比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。

反向零宽断言:表达式为-(?<=expression);作用:即匹配语句之后的数据;理解示例:

比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。

具体的使用方法

具体的使用方法示例,本次使用的测试数据:

{"name":"哈哈","birthday":"2000 05 23","hobby":"tabletennis","phone":'1234457878979',"phone":'(010)1008611',"phone":'(0100)1008611'};

1、匹配phone字段示例

最简单的情况下,一般会使用如下的方法来进行匹配,直接定位到字段,然后整段取值下来。

该表达式匹配的结果如下图1-1所示:使用该表达式能匹配到数据,但是取到数据中包含了其他不需要的字符,结果如下。

图1-1

但是通常情况下,我们只需要取相应的值即可,不需要字段及其他的符号。所以此时需要用到断言。使用断言的语句和结果如下图1-2所示;

图1-2

表达式解读:(?<=\"phone\"\:')-反向断言,匹配("phone":')后的数据,中间一段使用分枝条件来来匹配多种格式的数字,(?=')-正向断言,匹配(')前的数据,此时,所取到的数据就是我们所需的纯粹的数据。

2、 零宽断言和贪婪懒惰结合使用示例

一般情况下,根据实际情况,零宽断言除了单独使用之外,还常常和贪婪懒惰结合使用,下面,通过获取birthday字段来进行使用方法的示例;

使用语句匹配birthday,birthday的存储方式为年月日的方式,但是年月日之间的间隔使用空白符进行间隔。

若只使用常用的方法来进行匹配的话,一般匹配空白符的元字符为(\s),所以我们可以这样来写。

同样是精确匹配数据的方式,但是可以看到,需要重复的进行限制。很是麻烦。结果如下图2-1所示。

图2-1

 

除了上述的两种元字符联合使用之外,还有一种元字符也可以使用,那就是点(.),该元字符用来匹配除了/n,/r之外的任意单个字符,可以满足条件。所以我们可以换一种简洁的方式来进行数据的匹配:图中显示的为匹配到结果,与上面的表达式所得到的结果相同,结果如图2-2所示。

图2-2

 

使用此种方法也能准确的获取到数据,而且语句简洁。

表达式解读:其中正向和反向断言因为在前面已经说过,所以就不再重复,主要是中间(.*?)的一段表达式,也可以使用(.+?)的表达式。

我们可以先把反向断言先去掉,这样一步一步的来试的话,比较清楚。首先可以看一下,去掉后置断言后获取到的结果:图2-3所示。

图2-3

 

去掉反向断言后,只匹配到了一个数字,显然和我们实际想要的结果不一致。因为点(.)本来就是只匹配除/n,/r之外的任意一个字符,那我们需要匹配的是多个字符,可以选择星号(*)或者是加号(+)来实现。那我们继续试一下。由于(*)和(+)的结果都相同,所以就只试一个,图中使用(*),结果如图2-4所示。

图2-4

 

可以看到加上获取多个之后,虽然的确是获取到了多个,但是其他的数据我们并不需要,我们只需要取birthday一个字段的值就可以了,那这个时候我们就可以再加上一个条件,获取多个的同时,只允许出现一次,这次就需要加上反向断言,因为birthday后有多个字段,若不加上反向断言的话,则无法判断到底该取birthday后的哪一个字段,加上之后看一下结果,结果如图2-5所示。

图2-5

 

此时,显示的匹配结果就是我们真正需要的数据。

总结:正则表达式,语法比较生涩,而且主要的是靠在平时多进行练习,且同一种数据的获取可以由多种不同的语句来获得,这个主要看个人的喜好,而且就其中的贪婪和懒惰,用起来很容易,但是理解的时候也需要自己去一步一步的验证,知道怎么写,为什么这样写才是最好的。

最后,以上示例皆为自己测试所用,个人也是小白一个,写这篇文章也就是为了记录一下,若是有误的地方,欢迎指正。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值