WEB前端第四十课——正则表达式-RegExp、高级
1.RegExp对象
正则表达式的基本语法是:/正则表达式主体/修饰符(可选),这种创建正则的方法称为“字面量创建正则表达式”。
在 js中已经为正则表达式提供了一个“构造函数RegExp”,我们可以通过这个构造函数生成正则表达式的实例,
这种创建正则的方法称之为“构造函数创建正则表达式”。
对于RegExp函数生成的正则实例,既能够和之前使用正则表达式一样直接使用,还可以调用一些RegExp独有的方法。
语法:
var reg = new RegExp('正则表达式主体','修饰符'); //RegExp也称为“正则类”
注意,通过构造函数方式创建正则表达式,参数均采用“字符串”的形式来声明!
特别注意,这种方式的正则表达式主体在使用元字符时,需要使用转义字符“\”,比如“\\d、\\s”等
2.RegExp对象方法
① test()方法,用于判断在目标字符串中是否存在满足正则表达式规则的子字符串,返回值为Boolean。
语法:正则表达式 .test( ' 指定字符串 ' ); // true || false
示例:
var regExp = new RegExp('ab', 'g');
var res = regExp .test('abc123AABBCC');
console .log(res); //返回值为“true”
RegExp中提供的方法对于“字面量创建正则表达式”也是适用的,示例如下:
console.log(/ab/g .test('abc123AABBCC')); // true
② exec()方法,用于查找在目标字符串中“第一个”满足正则表达式的子字符串出现的“下标和内容”
返回值是一个信息集合(对象),可以像数组一样使用,查找失败则返回 null
语法:正则表达式 .exec('目标字符串');
示例01:
var regExp = new RegExp('ab', 'ig');
var res = regExp .exec('abc123AABBCC');
console .log(res); //返回值:["ab", index: 0, input: "abc123AABBCC", groups: undefined]
res = regExp .exec('abc123AABBCC');
console .log(res); //返回值:["ab", index: 7, input: "abc123AABBCC", groups: undefined]
res = regExp .exec('abc123AABBCC');
console .log(res); //返回值:null
可以看出,当 exec()方法连续多次查找时,每次查找都是建立在前一次的基础上,依次向后匹配。
这是由于RegExp正则对象中提供了一个隐式参数“lastIndex”,
这个参数将记录每次执行检索完成时,匹配结果的最后一个字符的下标,并且将其作为下次检索的开始位置。
这个属性是可写的,
如果上述示例中第一次检索完成后增加“res.lastIndex=0;”,那么第二次检索返回值将和第一次相同。
示例02:
var regExp = new RegExp('(ab)c', 'ig');
var res = regExp .exec('abc123AABBCC');
console .log(res); //返回值:["abc", "ab", index: 0, input: "abc123AABBCC", groups: undefined]
console .log(res.length); // 返回值:2
上述结果看出,当声明正则的时候,如果参数中存在小括号(又称作组匹配符号),
那么返回结果的 length就不为“1”(即不仅查找一次),
也就是说第一次查找“正则主体内容”,第二次查找“组匹配内容”,两次结果一起返回。
3.检索模式的“^和$”字符
“ ^ ”初位字符,表示判断字符串以某个内容开始
“ $ ”末位字符,表示判断字符串以某个内容结束
语法示例:
var regExp = new RegExp('^abc','ig'); //判断是否以abc字符串开始
var regExp = new RegExp('abc$','ig'); //判断是否以abc字符串结束
如果同时使用“^和$”(如“^abc$”),表示在目标字符串中与正则字符串本身相同
代码示例:
var regExp=new RegExp('c$','ig'); var str='abc123AABBCC'; var res=regExp.test(str); console.log(res); // true
4.重复类
重复类是正则表达式中使用大括号“{}”进行检索的一种模式,{}用来匹配符合正则要求的字符串连续出现的次数。
通常配合表达式模式一起使用
常见写法有以下三种:
{n},表示检索内容连续出现 n次
{n,},表示检索内容至少连续出现 n次
{n,m},表示检索内容连续出现大于等于 n次,小于等于 m次
语法示例:
var regExp = new RegExp('[a-z]{2}','g'); //表示 全局检索连续出现的两个小写字母
代码示例:
var regExp=new RegExp('[a-z]{2}','ig'); var str='abc123AABBCC'; var res=str.match(regExp); console.log(res); //返回结果:(4) ["ab", "AA", "BB", "CC"]
注意,如果不存在“组匹配符号”,那么重复类仅对其前面的一个字符有效!
示例代码:
var regExp=new RegExp('ab{2}','ig'); var str='abcabc123AABBCC'; var res=str.match(regExp); console.log(res); //返回结果:["ABB"]
var regExp=new RegExp('(abc){2}','ig'); var str='abcabc123AABBCC'; var res=str.match(regExp); console.log(res); //返回结果:["abcabc"]
5.贪婪模式、懒惰模式
贪婪模式(greed)、懒惰模式(lazy),这两种模式都是被固化至表达式内的两种隐形的检索模式,
它们不属于任何一种前述的检索模式,而是在此之外隐形生效的。
贪婪模式,
正则要求就一直向下匹配,直到无法再匹配为止的行为模式(如 n*)
懒惰模式,
一旦匹配到符合正则要求的内容就立即结束检索的行为模式(如 n?)
在正则中,不同的符号可以隐式说明当前的正则是采用贪婪模式还是懒惰模式。
常见符号:
贪婪模式:+、*、{n,}、{n,m}、……
懒惰模式:+?、?、*?、{n}、{n}?、{n,m}?、……
代码示例:
//---贪婪模式--- var regExp=new RegExp('s[a-z0-9]+s','ig'); var str='abscabc12S3AeSvBhC2286s96'; var res=str.match(regExp); console.log(res); //返回值:["scabc12S3AeSvBhC2286s"]
//---懒惰模式--- var regExp=new RegExp('s[a-z0-9]+?s','ig'); var str='abscabc12S3AeSvBhC2286s96'; var res=str.match(regExp); console.log(res); //返回值:["scabc12S", "SvBhC2286s"]
6.脱字符
脱字符是正则中“^”符号的一种特殊表达方式,表示“不是……”的意思,
当且仅当“^”符号出现在中括号的首位时,我们称之为脱字符。
写在正则主体首位而不是中括号内表示初位字符,写在中括号内却没有写在首位则表示普通字符。
中括号内只有脱字符时“[^]”,表示所有字符!
代码示例:
var regExp=new RegExp('[^bc]+','ig'); var str='abscabc12S3AeSvBhC2286s96'; var res=str.match(regExp); console.log(res); //返回结果:["a", "s", "a", "12S3AeSv", "h", "2286s96"]