《JavaScript高级程序设计》五、引用类型(RegExp)
RegExp类型
通过RegExp类型来支持正则表达式。
let expression = /pattern / flags
其中的模式(pattern)部分可以是任何简单或复杂的正则表达式,可以包含字符类、限定符、分组、向前查找以及反向引用。
每一个正则表达式都可带有一或多个标志(flags),用以表明正则表达式的行为。
正则表达式的匹配模式支持下列3个标志:
- g:表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止;
- i:表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写;
- m:表示多行(multiline)模式,即在到达一行文本末尾时还会继续查找下一行是否存在于模式匹配项
正则表达式 = 1个模式+ 3个标志 (任意),不同的组合产生不同结果
注意:默认情况下,一个字符串无论是否换行,只要只有一个开始标志和一个结束标志$,如果采用多行匹配,那么每一行都有一个和&作为开始和结束。
基本使用:
//匹配字符串所有“fur”的实例
pattern1 = /fur/g ;
//匹配第一个字符串“fur”,不区分大小写
pattern2 = /fur/i ;
//匹配所有“fur”实例且不区分大小写。
pattern3 = /fur/gi ;
console.log(pattern1.test("catfur"))//true
console.log(pattern2.test("catFur"))//true
console.log(pattern3.test("catFur"))//true
注意:模式中使用的所有元字符都必须转义,包括:( { ^ $ | ) * + . ] }
,因为这些元字符的正则表达式中都有特殊用途。
例如:
//匹配第一个fur或cur,不区分大小写
let p1 = /[fc]ur/i;
//匹配第一个"[fc]ur",不区大小写,转义有特殊用途的[]
let p2 = /[fc]ur/i ;
console.log(p1.test("catFur"))//true
console.log(p2.test("cat[Fc]Ur"))//true
除了用字面量定义正则表达式,还可以通过RegExp构造函数,接收两个参数:一个是匹配的字符串,一个是可选的标志字符串。
例如:
let p1 = new RegExp("[fc]ur","i")
console.log(p1.test("catFur"))//true
注意:由于构造函数的模式参数都是字符串,所以所有元字符都必须进行双重转义即\
,转义过的字符也是如此。
let p1 = new RegExp("\[fc\]ur","i")
console.log(p1.test("cat[Fc]ur"))//true
RegExp实例属性
global:布尔值,表示是否设置了g标志
ignoreCase:布尔值,表示是否设置了i标志
lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从0算起。
multiline:布尔值,表示是否设置了m标志
source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回。
例如:
let p = /[fc]ur/i;
console.log(p.ignoreCase)//true
console.log(p.lastIndex)//0
console.log(p.source)//[fc]ur
RegExp实例方法
exec()
该方法专门为捕获组设计。接受一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组,或者没有匹配项时返回null。
返回的数组虽然是Array的实例,但是包含index和input两个额外属性,index表示匹配项字符串的位置,input表示应用正则表达式的字符串。
在数组中,第一项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串。(如果没有捕获组,则只有第一项)
例如:
let text = "fur like study and play"
let p = /fur( like study( and play)?)?/gi;
let matches = p.exec(text)
console.log(matches.index)//0
console.log(matches.input)//fur like study and play
console.log(matches[0])//fur like study and play
console.log(matches[1])// like study and play
console.log(matches[2])// and play
对于exec()
方法,即使设置了全局标志,每次页只会返回第一个匹配项,不过会继续找新的匹配项;但是如果不设置全局标志,则会在同一个字符串上多次调用exec()
将始终返回同一个结果。
let text = "fur is fur"
let p1 = /fur/g;
let matches1 = p1.exec(text)
console.log(matches1.index)//0
console.log(matches1[0])//fur
console.log(p1.lastIndex)//3
matches1 = p1.exec(text)
console.log(matches1.index)//9
console.log(matches1[0])//fur
console.log(p1.lastIndex)//12
let p2 = /fur/;
let matches2 = p2.exec(text)
console.log(matches2.index)//0
console.log(matches2[0])//fur
console.log(p2.lastIndex)//0
matches2 = p2.exec(text)
console.log(matches2.index)//0
console.log(matches1[0])//fur
console.log(p2.lastIndex)//0
test()
接受一个字符串参数,在模式与该参数匹配情况下返回true,否则返回false。常用于验证输入是否有效。
let text = "000-00-0000"
let p = /d{3}-d{2}-d{4}/;
console.log(p.test(text))//true
RegExp实例继承的toString()
,toLocaleString()
返回的是字符串,valueOf()
返回的是正则表达式本身
let p = new RegExp("\[fc\]ur","i")
console.log(p.source)// [fc]ur
console.log(p.toString())// [fc]ur/i
console.log(typeof(p.toLocaleString()))// [fc]ur/i
console.log((p.valueOf()) instanceof RegExp)//true
RegExp构造函数属性
这些属性适用于作用域中的所有正则表达式,并且基于所执行的最近一次正则表达式操作而变化。而且可以通过两种方式访问他们。
长属性名 | 短属性名 | 说明 |
---|---|---|
input | $_ | 最近一次要匹配的字符串 |
leftContext | $` | input字符串中lastMatch之前的文本 |
rightContext | $’ | Input字符串中lastMatch之后的文本 |
lastMatch | $& | 最近一次匹配的项 |
lastParen | $+ | 最近一次匹配的捕获组 |
multiline | $* | 布尔值,表示是否所有表达式都使用多行模式 |
let text = "fur like play"
let p = /(.)ike/g;
if(p.test(text)){
console.log(RegExp.$_)//fur like play
console.log(RegExp["$`"])//fur
console.log(RegExp["$'"])// study
console.log(RegExp["$&"])//like
console.log(RegExp["$+"])//l
console.log(RegExp["$*"])//undefined
}
multiline输出结果与书本不合,以运行结果为准
还有多达9个用来存储捕获组的构造函数属性,RegExp["$1"]…RegExp["$9"]
let text = "fur like play"
let p = /(..)k(...)/g;
if(p.test(text)){
console.log(RegExp["$1"])//li
console.log(RegExp["$2"])//e p
}
扩展内容(来自菜鸟教程)
方括号:方括号用于查找某个范围内的字符:
表达式 | 描述 |
---|---|
[abc] | 查找方括号之间的任何字符。 |
[^abc] | 查找任何不在方括号之间的字符。 |
[0-9] | 查找任何从 0 至 9 的数字。 |
[a-z] | 查找任何从小写 a 到小写 z 的字符。 |
[A-Z] | 查找任何从大写 A 到大写 Z 的字符。 |
[A-z] | 查找任何从大写 A 到小写 z 的字符。 |
[adgk] | 查找给定集合内的任何字符。 |
[^adgk] | 查找给定集合外的任何字符。 |
(red|blue|green) | 查找任何指定的选项。 |
元字符:元字符(Metacharacter)是拥有特殊含义的字符:
元字符 | 描述 |
---|---|
. | 查找单个字符,除了换行和行结束符。 |
w | 查找单词字符。 |
W | 查找非单词字符。 |
d | 查找数字。 |
D | 查找非数字字符。 |
s | 查找空白字符。 |
S | 查找非空白字符。 |
匹配单词边界。 | |
B | 匹配非单词边界。 |