200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 正则匹配不包含某表达式的字符串

正则匹配不包含某表达式的字符串

时间:2020-08-01 19:52:41

相关推荐

正则匹配不包含某表达式的字符串

/^((?!pattern).)*&/

标题即答案,但是这句正则要怎么理解呢

要想理解首先要先弄明白(?!pattern)这一运算符

以下pattern就代表用户自己定义的表达式

(?!pattern)

正向否定预查(negative assert),在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如"Windows(?!95|98|NT|2000)“能匹配"Windows3.1"中的"Windows”,但不能匹配"Windows2000"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

上面这段是官方的陈述,但是很多人应该是看不懂

简单举个例子

var str1 = 'Windows10ABC'var str2 = 'Windows95ABC'var reg = /Windows(?!95|98|NT|2000)/console.log(reg.test(str1))//trueconsole.log(reg.test(str2))//false

上面这个例子中str1和str2先匹配windows都能成功,但是str2的windows后的是95所以不能被匹配,而str1的windows后面跟的是1,所以可以被匹配,这感觉有点像[^95],但是要注意的是用[^]时会消耗字符串,也就是索引会往下进行一位,但是用(?!)的话是索引是不会后移的,继续用这个例子来进行说明

var str1 = 'Windows10ABC'var reg1 = /Windows(?!95|98|NT|2000)1/var reg2 = /Windows(?!95|98|NT|2000)0/console.log(reg1.test(str1))//trueconsole.log(reg2.test(str1))//false

如果消耗字符,索引后移的话,那应该在匹配完windows之后再匹配0才对因为1位置的索引已经被消耗了,但是事实是在匹配完(?!)之后,索引继续停留在1的位置并继续开始匹配,因此reg1的输出结果才是true。

那么有了上述的概念之后,就可以理解/^((?!pattern).)*&/这句话是什么意思了。

因为不消耗索引,所以才会写成

(?!pattern). 的形式

因为其不消耗索引,并且.代表的是除换行符之外的所有字符,总结来说就是当前位置不为pattern的任意字符。

因此整句话,就可以理解为匹配以不是pattern作为开头,以不是pattern作为结尾,中间任意0到N个字符不是pattern的字符串

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。