javascript高级程序设计(第三版)学习笔记(一) 正(3)


var re1 = /(a(b(c)))d/;
var str = "abcdd";
var matches = str.match(re1);
alert(matches[0]);//abcd //这里是整个字符串
alert(matches[1]);//abc //这里是第一个小括号
alert(matches[2]);//bc // 这里是第二个小括号
alert(matches[3]);//c // 这里是第三个小括号


9、贪婪和非贪婪匹配 ?
贪婪匹配:匹配到之后,继续往后匹配到字符串结束,然后选择最长的。比如:对于字符串"aaaaaab",要匹配/a+/,那么匹配的将是"aaaaaa",而不是一个"a"。
非贪婪匹配:匹配到之后,马上停止。比如:对于字符串"aaaaaab",要匹配/a+?/,那么匹配的将是"a",而不是一个"aaaaaa"。用法就是在量词后面加"?"。

复制代码 代码如下:


var re1 = /a+/;
var str = "aaaaaaa";
alert(str.match(re1));// aaaaaaa
var re1 = /a+?/;
var str = "aaaaaaa";
alert(str.match(re1));// a


下面给一个综合一点的例子:讲解了贪婪和非贪婪,全局g,exec和match的区别???

复制代码 代码如下:


var re1 = /([a-z]*)bbb/;//贪婪
var re2 = /([a-z]*?)bbb/;//非贪婪
document.write(re1.test("abbbaabbb1234")+"<br />");//true
document.write(re1.exec("abbbaabbb1234")+"<br />");//abbbaabbb,abbbaa,这里贪婪匹配到abbaabbb,然后$1为abbbaa,所以此时返回abbbaabbb,abbbaa
document.write("abbbaabbb1234".match(re1)+"<hr>");//abbbaabbb,abbbaa,这里贪婪匹配到abbaabbb,然后$1为abbbaa,所以此时返回abbbaabbb,abbbaa
document.write(re2.test("abbbaabbb1234")+"<br />");//true
document.write(re2.exec("abbbaabbb1234")+"<br />");//abbb,a ,这里非贪婪匹配到abbb,然后$1为a,所以此时返回abbb,a
document.write("abbbaabbb1234".match(re2)+"<hr>");//abbb,a ,这里非贪婪匹配到abbb,然后$1为a,所以此时返回abbb,a
var re3 = /([a-z]*)bbb/g;//贪婪
var re4 = /([a-z]*?)bbb/g;//非贪婪
document.write(re3.test("abbbaabbb1234")+"<br />");//true
document.write(re3.exec("abbbaabbb1234")+"<br />");//null ,因为设置了g标识,并为贪婪匹配,而上面的test已经贪婪匹配到abbbaabbb,后面只有1234,所以此时匹配不到,返回null
document.write("abbbaabbb1234".match(re3)+"<hr>");//abbbaabbb,注意在设置了g标识后,match只返回匹配到的所有值,这里因为是贪婪匹配,所以匹配了abbbaabbb
document.write(re4.test("abbbaabbb1234")+"<br />");//true
document.write(re4.exec("abbbaabbb1234")+"<br />");//aabbb,aa ,因为设置了g标识,并为非贪婪匹配,而上面的test已经贪婪匹配到abbb,后面只有aabbb1234,所以此时在此匹配到aabbb,此时$1为aa,所以返回aabbb,aa
document.write("abbbaabbb1234".match(re4)+"<hr>");//abbb,aabbb 注意在设置了g标识后,match只返回匹配到的所有值,这里因为是非贪婪匹配,所以匹配了abbb,aabbb


10、反向引用
正则表达式中的匹配组捕获的子字符串。每个反向引用都由一个编号或名称来标识,并通过“\编号”表示法进行引用。

复制代码 代码如下:


/(\w+)/.test("hello-world");
dwl(RegExp.$1);//hello
dwl(/(居)\1/.test("居居"))//true 这里的\1表示第一个小括号里面的内容
dwl("aa bbb cccc".replace(/(\w{2,}) (\w{2,}) (\w{2,})/,"$3 $2 $1")); // cccc bbb aa


11、非捕获性分组 ?:
并不是每个小括号都能通过反向引用进行捕获,在小括号后面加上"?:",即可进行设置非捕获性分组。

复制代码 代码如下:


/(\w+)-(\w+)/.test("hello-world");
alert(RegExp.$0);//undefined
alert(RegExp.$1);//""不会被捕获
alert(RegExp.$2);//world


12、正向前瞻 ?= 和负向前瞻 ?!
(?=str) 匹配后面紧跟是str,比如 he 能够通过模式 /he(?=llo)/ 匹配 字符串 "hello"
(?!str) 匹配后面紧跟不是str,比如 hel 能够通过模式 /he(?!llo)/ 匹配 字符串 "hello"

复制代码 代码如下:


//这样理解,将(?=str)或者(?!str)当做条件,然后考虑匹配其他的部分,匹配到了之后,再拿条件作对比,看符不符合
dwl("he-lloworld".match(/(\w+)(?=world)/g)); //llo 这里先匹配(\w+),找到两个块,he和lloworld,其中he不符合(?=world),而lloworld,只要拆成llo和world连接,就符合(?=world),即,llo链接了一个world,所以这里匹配了llo
dwl("he-lloworld".match(/(\w+)(?!world)/g)); //he,lloworld 这里先匹配(\w+),找到两个块,he和lloworld,其中he不符合(?=world),而lloworld,只要不拆,就符合(?!world),即,llo链接了一个world,所以这里匹配了he,lloworld


13、出几个实例题目?
a、讲一个字符串中的所有英文单词首字母大写?

复制代码 代码如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wfydfg.html