正则表达式匹配不包括某些字符串的能力

常常我们会碰着想找出不包括某个字符串的文本,措施员最容易想到的是在正则表达式里利用,^(hede)来过滤”hede”字串,但这种写法是错误的。我们可以这样写:[^hede],但这样的正则表达式完全是别的一个意思,它的意思是字符串里不能包括‘h',‘e',‘d'三个但字符。那什么样的正则表达式能过滤出不包括完整“hello”字串的信息呢?

事实上,说正则表达式里不支持逆向匹配并不是百分之百的正确。就像这个问题,我们就可以利用否认式查找来模仿出逆向匹配,从而办理我们的问题:

复制代码 代码如下:

^((?!hede).)*$


上面这个表达式就能过滤出不包括‘hede'字串的信息。我上面也说了,这种写法并不是正则表达式“擅长”的用法,但它是可以这样用的。

表明

一个字符串是由n个字符构成的。在每个字符之前和之后,都有一个空字符。这样,一个由n个字符构成的字符串就有n+1个空字符串。我们来看一下“ABhedeCD”这个字符串:

正则表达式匹配不包罗某些字符串的本领

所有的e编号的位置都是空字符。表达式(?!hede).会往前查找,看看前面是不是没有“hede”字串,假如没有(是其它字符),那么.(点号)就会匹配这些其它字符。这种正则表达式的“查找”也叫做“zero-width-assertions”(零宽度断言),因为它不会捕捉任何的字符,只是判定。

在上面的例子里,每个空字符城市查抄其前面的字符串是否不是‘hede',假如不是,这.(点号)就是匹配捕获这个字符。表达式(?!hede).只执行一次,所以,我们将这个表达式用括号包裹成组(group),然后用*(星号)修饰——匹配0次或多次:

复制代码 代码如下:

((?!hede).)*。


你可以领略,正则表达式((?!hede).)*匹配字符串"ABhedeCD"的功效false,因为在e3位置,(?!hede)匹配不及格,它之前有"hede"字符串,也就是包括了指定的字符串。

在正则表达式里, ?! 是否认式向前查找,它帮我们办理了字符串“不包括”匹配的问题。

以下是一些增补:

分享下php生成随机数的三种要领,生成1-10之间的不反复随机数,php生成不反复随机数的例子,需要的伴侣参考下。

在hacker news上看到regex golf,几道很有趣的正则表达式的题,有的需要用到不匹配这种匹配,好比需要匹配不包括某个单词的串。

开始正题之前,先来看看正则表达式的语法:

[abc] a或b或c . 任意单个字符 a? 零个或一个a
[^abc] 任意不是abc的字符 \s 空格 a* 零个或多个a
[a-z] a-z的任意字符 \S 非空格 a+ 一个或多个a
[a-zA-Z] a-z或A-Z \d 任意数字 a{n} 正好呈现n次a
^ 一行开头 \D 任意非数字 a{n,} 至少呈现n次a
$ 一行末端 \w 任意字母数字或下划线 a{n,m} 呈现n-m次a
(...) 括号用于分组 \W 任意非字母数字或下划线 a*? 零个或多个a(非贪婪)
(a|b) a或b \b 单词界线 (a)...\1 引用分组
(?=a) 前面有a (?!a) 前面没有a \B 非单词界线

正则表达式中有(?=a)和(?!a)来暗示我们是否需要匹配某个对象。

所以,有需要不匹配某样内容时,就可以用(?!a)了。好比要匹配不含hello的字符串就可以这样写。

复制代码 代码如下:


^(?!.*hello)

这里.*用来暗示hello之前大概有其他的字符,为什么还要加^呢,因为假如不加的话,大概匹配到h之后的这个位置上了。

此刻就可以办理regex golf上的abba这道题了。
这道题是去匹配不含abba这种形式的单词,好比abba,anallagmatic就不该该匹配上。

正则表达式代码:

复制代码 代码如下:


^(?!.*(.)(.)\2\1)

然后操作不匹配,还可以办理prime这道题,这道题匹配有素数个x的串,先看正则。
 

复制代码 代码如下:


^(?!(xx+)\1+$)

(xx+)是匹配2个及2个以上的x,(xx+)\1+就是匹配反复呈现2个及以上的串,所以(xx+)\1+就暗示了那些非素数的串,那么素数串就是撤除这些非素数串,等于以上的正则表达式了。

PS:关于正则,本站还提供了2款很是轻便实用的正则测试东西供各人利用:

JavaScript正则表达式在线测试东西:

正则表达式在线生成东西:

您大概感乐趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsdxsj.html