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