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"'。

 

posted @ 2014-05-09 16:17  gabin  阅读(265)  评论(0编辑  收藏  举报