欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

正则的那点事

程序员文章站 2022-05-07 08:17:55
...

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

正则表达式是为了对字符串进行有效数据提取以及匹配的一种机制,那么我们首先就需要对字符串有一定的了解,比如随意一段话,
”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])也就是一个分组

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