RegExp子模式- "()"
读书笔记
把JavaScript权威指南拿出来瞅瞅,正巧看到了第十章 正则表达式的模式匹配
最初接触js的时候,基本上都是在做验证。什么数字验证、命名验证、身份证格式验证、电话号码验证。都是用正则表达式来完成,或者压根还不知道有一些插件和框架可以直接使用,但总归不是学习技术的路子。
刚巧碰上一个关键词想记下来“子模式”
这边用一个原书的例子:
Function.prototype.getName=function(){ if(this.name) return this.name; // 非标准 // 利用正则表达式中的([^\(])*子模式抽离出function后非(的字符串 return this.name=this.toString().match(/function\s+([^\(])*\(/)[1]; // this.toString().match(/function\s*([^\(])*\(/)返回的是['function test(','test'] }; function test(){} test.getName(); // 返回test
/function\s*([^\(])*\(/ 正则表达式中圆括号里面属于一个子模式,也就是match返回的结果中有单独检测出符合子模式中正则表达式的结果,是以function开头且至少存在一个空格符号后跟随的非‘(’字符,看着可能很绕口。再用一个比较简单的例子来理解
console.log('abc'.match(/ab*/)); // ['ab'] console.log('abc'.match(/a(b)*/)); // ['ab','b']
// 加了子模式后,把子模式的部分抽离出来,b就属于括号内的子模式匹配
子模式除了可以抽离出我们想要的数据外,还可以作为文本引用表示同一个模式匹配,原书中用了单引号和双引号中内容匹配来说明
"a'cdef\"a'b".match(/['"][^'"]*['"]/); // ["'cdef""] 两侧的引号不匹配 "a'cdefa\"'b".match(/(['"])[^'"]*\1/); // null "a'cdefa'b".match(/(['"])[^'"]*\1/); // ["'cdefa'", "'"] 两侧引号匹配 "a'cd\"efa'b".match(/(['"])[^\1]*\1/); // ["'cd"efa'", "'"] 这种写法是错的,匹配出来的结果中单引号里面包含了单个双引号
在这边用到子模式引用所达到的效果就是前后2个引号是相互匹配的,只会匹配出双引号或单引号括起来的内容,而不会出现由单引号和双引号混合括起来的内容被匹配。“ ’ ab“ ”就无法匹配,必须是"'ab'",或者是'"ab"'。