正则的那点事

什么是正则表达式,相信在看这篇文章的人对正则都有了一定的了解,也有可能会写一定的正则表达式,那么我写这个的意义何在,主要是带大家看一看我所认识的正则表达式,

正则表达式是为了对字符串进行有效数据提取以及匹配的一种机制,那么我们首先就需要对字符串有一定的了解,比如随意一段话,
”32 12 3 6 1 3 3”,
这是
<我的一个道姑朋友>的谱子其中一段,一共是9个音符,但是却有16个位置,这是为什么呢



字符串在匹配的过程中将会以第一个位置开始获的控制权,然后从左往右进行依次匹配,每尝试匹配一次,就会把控制权交由下一个位置,然后依次匹配,至于正则匹配的基础知识,这里不做多讲,网上有很多


那么我们接下来讲什么呢,我觉得还是按照深浅的层次分类来说

1.

贪与不贪的问题

这里有一个例子开头


这是一段字符串,我搞了一个正则去匹配

<b>(.)*</b>复制代码

一眼就可以看得出来我要匹配的是<b>到</b>

的数据,如果不出意外,应该会有两个返回结果,但是我这里得到的结果确是


那么如果我把aaa替换成其他的信息呢,比如一个标签,
结果发现返回仍然只有一条,这个时候,我再试一试这么一个正则

<b>(.)*?</b>

复制代码


里却有了两条返回,明明只是多了一个?,为什么效果却不一样,那么这个贪与不贪说的是什么呢,贪的是说正则在不约束的情况下会自行向右进行匹配,直到匹配结束,而且只要匹配到数据有正则的最后一个匹配值就算是匹配到了,就好比你让他拿2113,他却在拿2113后又拿了许多东西,只要最后一个拿到了3,他就算匹配到了。


而一个问号的存在就是解决了正则贪婪的问题,但是并不是把 放在哪里都可以解决贪婪的,在正则里,有一些属于贪婪模式量词,分别有

“{m,n}”、“{m,}”、“?”、“*”和“+”复制代码
,这些才是正则贪婪的元凶,非贪婪模式的时候则会在第一次匹配成功结束后结束匹配,那么至于为什么图上会有两个返回值,emmmm,那是因为我开了全局的原因

断言

什么是断言,我们要知道什么是零宽,说实在的这个真的没啥好知道的,零宽其实就是零宽度,而这里的宽度讲的是字符串位置的宽度,正则匹配的时候,如果匹配不到,会把控制权不断交由下一个规则会判断,但是判断的位置还是在同一位置,这也就是所谓零宽,在断言这里,还是有很多比较实用的知识点,比如

(?=X)复制代码
,这个又被称作零宽度正预测先行断言,有点长,举个例子。


这里的正则表达式的意思是匹配LXG前面的数据,有点判断处理的意思,如果我们把 \w+放在

(?=MA)后面,我们获得就是MALXG,这是因为控制权是由左往右,细细思索也就会发现其中缘由,可如果我们不想匹配MA,只想匹配LXG怎么办,那么我们只需要使用(?<=MA)\w+,那么就会自动匹配MA后面的了,这些需要一点记忆。

  • (?=exp):零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp
  • (?<=exp):零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp
  • (?!exp):零宽度负预测先行断言,断言此位置的后面不能匹配表达式exp
  • (?<!exp):零宽度负回顾后发断言来断言此位置的前面不能匹配表达式exp

正则中的分组

这里不只有分组,还有命名空间。Hhhh,例如

(\w+)被一个括号包围起来是一个整体,表示一个分组

(?'Group'\w+))表示了一个叫做Group的分组

(?:\w+)匹配exp,不捕获匹配的文本,也不给此分组分配组号

每一次匹配成功都会往组内填充匹配的位置,这里做的是堆栈处理

反向引用

反向引用的目的是为了把组内匹配的数据反向匹配,有些类似变量的存值与取值,

比如‘asdgfdh’;而正则为([a|b])\1就是把[a|b]匹配到的数据堆栈的第一位取出来作为新的匹配规则来匹配,([a|b])也就是一个分组

正则讲到这里,算是讲了一部分了,也算是在平时涌出比较多的,基础的我也不多讲,主要还需要练习,夜有些晚了,明天又是满满一天的课,晚安,世界,晚安,读者。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值