第五章 引用类型>RegExp类型
RegExp类型(正则表达式)
正则匹配模式支持的标志:
var expression = /pattern/ flags; //flags即匹配模式标志
g: 全局模式,被应用与所有字符串,而非发现第一个匹配性时立即停止。
i: 不区分大小写模式。
m: 多行模式,到达文本末尾还会继续查找下一行中是否存在匹配项。
var pattern1 = /at/g; //匹配所有字符串中的at实例; var pattern2 = /bc[at]/i;
//匹配所有at结尾的字符串,不区分大小写
匹配元字符(即特殊符号 )时,必须转义
正则表达式中其他字符的含义:
{n, m} 匹配前一项至少n次,但是不能超过m次
{n, } 匹配前一项n次,或者多次
{n} 匹配前一项恰好n次
? 匹配前一项0次或1次,也就是说前一项是可选的. 等价于 {0, 1}
+ 匹配前一项1次或多次,等价于{1,}
* 匹配前一项0次或多次.等价于{0,}
___________________________
[...] 位于括号之内的任意字符
[^...] 不在括号之中的任意字符
. 除了换行符之外的任意字符,等价于[^\n]
\w 任何单字字符, 等价于[a-zA-Z0-9]
\W 任何非单字字符,等价于[^a-zA-Z0-9]
\s 任何空白符,等价于[\ t \ n \ r \ f \ v]
\S 任何非空白符,等价于[^\ t \ n \ r \ f \ v]
\d 任何数字,等价于[0-9]
\D 除了数字之外的任何字符,等价于[^0-9]
[\b] 一个退格直接量(特例)
___________________________
/\d{2, 4}/ //匹配2到4间的数字.
/\w{3} \d?/ //匹配三个单字字符和一个任意的数字.
/\s+java\s+/ //匹配字符串"java" ,并且该串前后可以有一个或多个空格.
/[^"] * / //匹配零个或多个非引号字符.
RegExp的 实例属性
正则的每个实例都具有下列属性:
global:布尔值,是否设置了g标志(全局模式);
ignoreCase: 布尔值,是否设置了i标志。
multiline: 布尔值,是否设置了m标志;
lastIndexOf: 整数,表示开始搜索下一个匹配项的字符位置。
source: 正则的字符串表示,按照字面量形式传入构造函数中的字符串模式返回。
var pattern1 =/\[bc\]at/i; console.log(pattern1.global); console.log(pattern1.ignoreCase); console.log(pattern1.multiline); console.log(pattern1.lastIndex); console.log(pattern1.source); // false // true // false // 0 // \[bc\]at
RegExp的 实例方法
exec(): 为捕获组设计的,接受一个参数,即要应用模式的字符串(变量), 返回包含第一个匹配项信息的数组(Array的实例);没有匹配的情况返回null; 返回的数组包含2个额外属性:index (匹配项在字符中的位置)和 input(表示应用正则的字符串);
var text = "mom and dad and baby"; var pattern = /mom(and dad( and baby)?)?/gi; var matches = pattern.exec(text); console.log(matches.index); console.log(matches.input); console.log(matches[0]); console.log(matches[1]); console.log(matches[2]); // 0 表示匹配项再字符串中的位置 // mom and dad and baby 应用的匹配模式的字符串 // mom 第一个匹配的是mom // undefined
exec(): 即使再模式中设置了全局标志(g),每次也只返回一个匹配项。如果再同一个字符串多次调用exec()将始终返回第一个匹配项。
非全局模式下,每次调用exec(),返回的都是一个匹配项
var text = "cat , bat, sat, fat"; var pattern1 = /.at/; var matches = pattern1.exec(text); console.log(matches.index); console.log(matches[0]); console.log(pattern1.lastIndex); // 0 // cat // 0 matches = pattern1.exec(text); console.log(matches.index); console.log(matches[0]); console.log(pattern1.lastIndex); // 0 // cat // 0
全局模式下,每次调用exec()返回字符串中的下一个匹配项,直到搜索完毕。lastIndex值再每次调用exec都会增加
var pattern2 = /.at/g; var matches = pattern2.exec(text); console.log(matches.index); console.log(matches[0]); console.log(pattern2.lastIndex); // 0 // cat // 3 matches = pattern2.exec(text); console.log(matches.index); console.log(matches[0]); console.log(pattern2.lastIndex); // 6 // bat // 9
test(): 接受一个字符串参数。再模式与该参数匹配的情况下返回true,不然返回false;用来判断目标字符串与模式是否匹配;
var text = "000-00-0000"; var pattern = /\d{3}-\d{2}-\d{4}/; if(pattern.test(text)) { console.log("the pattern was mathesd.") } // the pattern was mathesd.
RegExp 构造函数属性
(长属性名)input: (短)$_ 最近一次要匹配的字符串。
lastMatch $& 最近一次的匹配项。
lastParen $+ 最近一次匹配的捕获组;
leftContext $` input字符串中lastMatch之前的文本
multiline $* 布尔值,表示表达式是否使用多行模式
rightContext $' input字符串中lastMatch之后的文本