js正则表达式之 (?=) (?!)

来源:互联网 发布:windows cacti 中文版 编辑:程序博客网 时间:2024/05/20 08:24

百度空间改得不知怎么用了,把以前的文章转过来



今天搞了一个东西,拿到一个url后,想在url的search后面加个参数,当然这个url是任意的

var url = ‘http://www.aa.com/b.html?a=b#c=d’, adtag =‘share’,pre = url.lastIndexOf('?')>-1 ? '&': '?';

if(url.lastIndexOf('#')>-1){

url = url.replace(/(#)(?=[^#]*)$/, pre + 'adtag=' + adtag + '#');

}else{

url = url + pre + 'adtag=' + adtag;

}

 

后面发现,总是加不成功,如以下例子

'http://www.aa.com/b.html?a=b#c=d'.replace(/(#)(?=[^#]*)$/, 'zzzzz#')

》"http://www.aa.com/b.html?a=b#c=d"


后面尝试把$放在(?=)里面,居然成功了

'http://www.aa.com/b.html?a=b#c=d'.replace(/(#)(?=[^#]*$)/, '&adtag=share#')"http://www.aa.com/b.html?a=b&adtag=share#c=d"

没有$的情况也成功'http://www.aa.com/b.html?a=b#c=d'.replace(/(#)(?=[^#]*)/, '&adtag=share#')"http://www.aa.com/b.html?a=b&adtag=share#c=d"


再看下面的内容

"fdjka ljfdl stop fjdsla fdj".match(/((?!\bstop\b).)+/);   返回 ["fdjka ljfdl ", " "]
"fdjka ljfdl stop fjdslafdj".match(/((?!\bstop\b).)+/);    返回 ["fdjka ljfdl ", " "]
"fdjka ljfdl stop fjdslafdj".match(/((?!\bstop\b).)+/g);  返回  ["fdjka ljfdl ", "top fjdslafdj"]
"fdjka ljfdl stop fjdslafdj".match(/(.)+/);  返回  ["fdjka ljfdl stop fjdslafdj", "j"]
"aaa ffffff 999999999".match(/(\w)((?=\1\1\1)(\1))+/g);  返回   ["ffff", "9999999"]
"fdjka ljfdl stop fjdslafdj".match(/(.(?!\bstop\b))+/g);   返回  ["fdjka ljfdl", "stop fjdslafdj"]


看了上面后,再参考http://www.regexlab.com/zh/regref.htm 所说,发现(?=) (?!)都只是向右匹配
比如   (?!\bstop\b).)是指 .匹配的字符,其左边第一个字符开始向右,不包括第一个,(向右是可以穿过自己的哦),不匹配\bstop\b,这样,
"fdjka ljfdl stop fjdslafdj".match(/((?!\bstop\b).)+/);返回["fdjka ljfdl ", " "] 的结果便可以解释得通,到stop的s时,s前面第一个字符向右可以找到"stop "这样的字符串,与\bstop\b相符(注意 " stop"与/\bstop\b/不是全匹配哦,"stop"与/\bstop\b/才是全匹配上),所以到s便不合适了;重新从s后面的t开始找到  "top fjdslafdj"又是相符的,所以"fdjka ljfdl stop fjdslafdj".match(/((?!\bstop\b).)+/g);返回["fdjka ljfdl ", "top fjdslafdj"]的结果也可理解。
对于/(.(?!\bstop\b))+/是指.号找到字符时,右边的字符串(包括右边的第一个)不与\bstop\b匹配, 到第二个空格时,右边可以找到stop与\bstop\b 匹配,所以第二个空格不符合要求,上面最后一个表达式"fdjka ljfdl stop fjdslafdj".match(/(.(?!\bstop\b))+/g);["fdjka ljfdl", "stop fjdslafdj"]便可以理解了。



原创粉丝点击