/^((?!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的字符串