其他教程

其他教程

Products

当前位置:首页 > 其他教程 >

正则表达式中的?!的运用

GG网络技术分享 2025-03-18 16:14 0


问题描述:

/^(?![^a-z]+$)(?![^A-Z]+$)[\\w@]{6,12}$/
这句表达式中的(?![^a-z]+$)是什么意思?

网友观点:

?!表示不以xxx开头。

(?![^a-z]+$)的意思是不以非小写字母开头

正则表达式的三种模式

最近在忙的新玩意用到了正则表达式,想了想以后可能要经常用到,索性就一次学精细点,后面再用到稍微看一下就能再上手。

封面来源于相泽南的推特,感觉真人比美图后的照片漂亮多了。

以下是正文:

正则表达式有三种模式:贪婪匹配、非贪婪匹配和独占模式。

这些模式会改变量词的匹配行为,选择不恰当的模式有时会造成巨大的资源浪费。

欢迎阅读腾讯云分享的这个案例,可以阅读完文章后再去看一看。

首先,我们来看一下贪婪匹配

在正则中,表示次数的量词默认是贪婪的,在贪婪模式下,会尝试尽可能最大长度去匹配。

首先,我们来看一下在字符串 aaabb 中使用正则 a* 的匹配过程。

a* 在匹配开头的 a 时,会尝试尽量匹配更多的 a,直到匹配到字母 b ,不满足要求为止。

那么如何将贪婪模式变成非贪婪模式呢?我们可以在量词后面加上英文的问号 (?),正则就变成了 a*?

这一次我们可以看到,这次匹配到的结果都是单个的 a,就连每个 a 左边的空字符串也匹配上了。

到这里就很明白了,非贪婪模式会尽可能短地去匹配。

所以二者的区别在于,

贪婪:表示次数的量词,默认是贪婪的默认尽可能多地去匹配。

非贪婪:“数量”云字符后加?找出长度最小且满足要求的。

从下面这个示例中,我们可以看出两者对比上的差异。

文本是一样的,其中有两对双引号。

不同之处在于,第一个的示例中,不加问号时正则是贪婪匹配,匹配上了从第一个引号到最后一个引号之间的所有内容;而第二个是非贪婪匹配,找到了符合要求的结果。

最后总结

正则中量词默认是贪婪匹配,如果想要进行非贪婪匹配需要在量词后面加上问号。

贪婪和非贪婪匹配都可能会进行回溯,独占模式也是进行贪婪匹配,但不进行回溯,因此在一些场景下,可以提高匹配的效率。

具体能不能用独占模式需要看使用的编程语言的类库的支持情况,以及独占模式能不能满足需求。

标签:

提交需求或反馈

Demand feedback