js内置对象之RegExp
RegExp,是正则表达式(regular expression)的简写。RegExp提供了一些创建和使用正则表达式的一些方法。提供用正则表达式进行验证和查找的方法。
作用:①既需要找关键词内容,又需要找关键词的位置;②验证字符串格式
1、创建正则表达式
1.1 固定的正则表达式(直接量)
如果只创建一次,以后不变,需要创建固定的正则表单时,形如:
var 变量名 = /正则/gi;
由于两个“/”之间遵循正则表达式的语法,中间如果出现正文,都需要转义。
1.2 实例化RegExp对象
如果动态生成正则表达式时,使用实例化的方法创建正则表达式。
var 变量名 = new RegExp("正则"[,gi]);
“g”和“i”是参数,可选。“正则”中如果出现“"”或者“\”,都需要转义。
2、正则API
2.1 exec方法
既可以查找关键词内容,又可以查找关键词的位置。如果 exec() 找到了匹配的文本,则返回一个结果数组。否则,返回 null。exec方法默认只查找一个,如果需要查找全部,需要在正则表达式中加上参数g。
var arr = reg.exec(str);
原理:str的从开始位置开始,找下一个匹配的关键词,将找到的放入arr中,为arr添加index属性,表示当前关键词的位置。须配合循环结构使用。exec方法可自动修改RegExp对象的lastIndex属性,RegExp的lastIndex属性定义了下次开始的位置。
注意:需要及时把查找的存入arr中的关键词和位置(即index)保存或打印出来,下一次查找的结果会覆盖这次结果。
贪婪模式&懒惰模式
贪婪模式:正则表达式默认匹配最长的符合条件的子字符串。正则表达式有“+”或“*”会发生贪婪模式。
懒惰模式:正则表达式仅匹配最短的符合条件的子字符串。
贪婪模式改懒惰模式:在“+”、“*”正两个符号后加“?”字符,变为“+?”、“*?”
//匹配网页中的所有超链接的a元素 (<a\s+[^>]*href=)(["|'])([^'"]+)\2[^>]*>.*?</a>
练习1:获取一段HTML文本中所有超链接的href属性的值
var html = '<link href="css/bootstrap.css">'
+'<a class="btn" href="https://www.baidu.com">百度一下</a>'
+'<a name="#top">返回顶部</a>'
+'<a href="https://i.cnblogs.com" title="cnblogs">博客园</a>'; //匹配html中的所有超链接a元素 /*//创建正则表达式的方式一: var reg = /(<a\s+[^>]*href=)(["|'])([^'"]+)\2[^>]*>.*?<\/a>/g; */ //创建正则表达式的方式二: var reg = new RegExp("(<a\\s+[^>]*href=)([\"|\'])([^\'\"]+)\\2[^>]*>.*?</a>","gi"); var arr = null; //循环调用 while(arr = reg.exec(html)){ console.log("在位置"+arr.index+"发现超链接url"+RegExp.$3); }
匹配正则中某个分组的子内容:
①在正则内部:使用“\n”,n表示第n个分组
②在replace方法内部使用“$n”表示和正则中的n个分组匹配的内容
③使用“RegExp.$n”表示和正则表达式匹配关键词和第n个分组匹配的内容
练习2:当关键词保存在数组中时,查找数组中所有关键词的位置和关键词。
var kword = ["程序员","注释","程序"] var str = "真正的程序员从来不写注释,难写的程序必定也难读。" +"真正的程序员不写应用程序,他们从最底层的裸机开始编程。" +"真正的程序员他们认为应用程序编程是那些不会系统编程的人干的活。" +"真正的程序员不画流程图,流程图是没文化的人的文档,居住在山洞里的人才在岩壁上画流程图。"; var reg = new RegExp(kword.join('|'),'g'); var arr = null; while(arr = reg.exec(str)){ console.log("在位置"+arr.index+"处,发现关键词"+arr[0]); }
2.2 验证字符串格式
验证的正则表达式都要前加“^”,后加“$”。
test()方法,验证通过,返回true;不通过,返回false。
var bool = reg.test(str);
练习:注册密码强度验证,请用户输入密码,要求:字母、数字组成;至少包含一位数字和一位大写字母。
/*//正则表达式一: var reg = /^(?![a-z0-9]+$)(?![a-zA-Z]+$)[a-zA-Z0-9]{6,16}$/; */ //正则表达式二: var reg = RegExp("(?![a-z0-9]+$)(?![a-zA-Z]+$)[a-zA-Z0-9]{6,16}"); //反复调用reg的test方法,请用户输入密码,直接作为test方法的参数,判断验证结果 while(!reg.test(prompt("请用户输入密码:"))){ alert("密码强度不够!") } document.write("密码修改成功!")