对于《JS高程设计》中RegExp的学习笔记总结
ECMAScript通过RegExp对象支持正则表达式的应用
一、RegExp对象声明
字面量声明形式
1、表达式:
var expression = / pattern / flags;
模式(pattern)部分可以是任意的正则表达式,每个正则表达式可以带一个标志位flags,用来表明正则表达式的行为;
flags:
g:表示全局模式,去匹配整个字符串,完成全匹配,而非找到一个即停止;
i:不区分大小写模式匹配;
m:多行模式,一行文本末匹配完成会继续查找下一行;
2、对于某些 “ 特殊 ” 字符的处理 字符串中带有一些正则表达式的元字符(即这些元字符在正则表达式中具有重特殊意义,容易产生歧义),需要进行转义; 元字符包括:( [ \ ^ $ | ? * + . ] ); 转译方式:在元字符前面加“ \ ”; 例:当想在字符串 str = " abc[bc]at " 中的匹配" [bc]at "时,需要对敏感字符进行转译,即"[]",在其前面加"",因此正则表达式应为: var model = /[bc]at/;
构造函数声明方式
1、表达式:
var model = new RegExp( pattern , flags );
注意:RegExp构造函数接受的两个参数需要均为字符串,pattern和flags都要为字符串,需要注意的点就是,在上文字面量表达式需要转译的的基础上还要进行一次双重转译,转移规则就是需要注意" \ "要变为" \ ";
例:
字面量正则表达式:/\w\hello\123/
RegExp声明正则表达式:"/\w\\hello\\123/";(字符串双重转译)
ECMA5已经规定: 使用字面量正则表达式和调用RegExp构造函数一样,每次都会新创建RegExp示例;
二、RegExp实例
1、RegExp实例属性
global,ignoreCase,multiline:返回布尔值,表示是否设置对应属性(标志位);
source:按照字面量定义形式返回正则表达式;
2、RegExp实例方法
regexp.exec()
exec()专为捕获组而设计,接收一个参数,即要被匹配的字符串,返回一个包含匹配信息的数组;若没匹配到返回 null ;
对于返回数组的解析,自己总结部分(不一定对,仅供参考)
exec()函数具有一个很有意思的特点,JS高程中提及到说exec()函数专门为捕获组设计;这句话其实很有意思;
1、捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用
对于正则子表达式使用()进行区分的,例如 (..)or(.) ,想匹配的可以理解为**or*格式的内容,而(..)和(.)都是两个子表达式,因此exec()也会在返回数组中将这两个子表达式匹配到的内容进行返回;
var str = "short abort";
var model = new RegExp( "(..)or(.)" , "g" );
model.exec( str );
Array(3) [ "short", "sh", "t" ]
2、全局和非全局下的exec()函数异同
全局模式下:
exec()在全局模式下,每次也只会返回一个完整匹配项,多次对于相同字符串调用exec()方法,会继续匹配新匹配项。
var str = "short abort";
var model = new RegExp( "(..)or(.)" , "g" );
model.exec( str );
Array(3) [ "short", "sh", "t" ]
model.exec( str );
Array(3) [ "abort", "ab", "t" ]
model.exec( str );
null
model.exec( str );
Array(3) [ "short", "sh", "t" ]
model.exec( str );
Array(3) [ "abort", "ab", "t" ]
非全局模式下:
exec()非全局模式下,每次匹配都只会匹配第一个符合要求的项,不会继续向后进行匹配;
需要注意作为返回结果的数组还具有额外属性: input:表示被应用正则表达式的字符串; index:表示匹配项在字符串中的位置; 对于返回的数组
regexp.test();
语法:
regexpMode.test(string);
接受一个字符串参数,返回值boolean变量,常用于判断;
三、RegExp构造函数属性
RegExp构造函数包含一些属性(可以理解为静态属性),这些属性会基于最近一次执行的表达式操作而变化;
1、这些属性具有长短两种属性名;
例如: input = $_ 代表最近一次要匹配的字符串;
2、$n
此外还有 $1 ~ $9,还有9个用于存储捕获组的构造函数属性,若没有子表达式,则上述捕获组属性返回空字符串;
**小技巧:可以在一个完整的正则表达式外侧加个 () ,“构造”一个子表达式,这样 $1 会拿到完整匹配值;