javaScript正则表达式经常使用三种语法做一个辨别:
?:
?=
?!
1、?:
非猎取婚配
同()
都是对正则举行分组,然则二者有区分:
-
(?:XXX)
只婚配,但不能猎取括号内的婚配字符 -
()
婚配到并且能猎取括号内的婚配字符
'JavaScript is fun'.replace(/([Jj]ava)(?:[Ss]cript)/,"$2"); // "$2 is fun" 猎取不到第二个括号内婚配的值
'JavaScript is fun'.replace(/([Jj]ava)([Ss]cript)/,"$2"); // 'Script is fun'
2、?=
正向一定预查,非猎取婚配
(?=pattern)
在任何婚配pattern的字符串最先处婚配查找字符串,不斲丧字符,相当于一种润饰。
?=
和?:
的区分,能够从下面例子中看处置惩罚:
"JavaScript is fun".replace(/([Jj]ava)(?:[Ss]cript)/,"$1"); // "Java is fun"
"JavaScript is fun".replace(/([Jj]ava)(?=[Ss]cript)/,"$1"); // "JavaScript is fun"
浅显点说:
?=
只是一个
润饰,它不是主体,然则不相符这个润饰的不要,相符的也只是婚配到了须要润饰的主体部份。
?:
他是一个主体,然则不能猎取
3、?!
正向否认预查,非猎取婚配
不相符parttern的就婚配胜利,这个和(?=parttern)
恰好相反。
'a.jpg,a.png,a.gif,a.jpg'.replace(/\a(?!\.jpg)/g, '****'); // "a.jpg,****.png,****.gif,a.jpg"
// 和?=做一个对照
'a.jpg,a.png,a.gif,a.jpg'.replace(/\a(?=\.jpg)/g, '****'); // "****.jpg,a.png,a.gif,****.jpg"