精简《JavaScript高级程序设计》五、引用类型(RegExp)

《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 匹配单词边界。
\B 匹配非单词边界。
\0 查找 NULL 字符。
\n 查找换行符。
\f 查找换页符。
\r 查找回车符。
\t 查找制表符。
\v 查找垂直制表符。
\xxx 查找以八进制数 xxx 规定的字符。
\xdd 查找以十六进制数 dd 规定的字符。
\uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符。
量词
量词 描述
n+ 匹配任何包含至少一个 n 的字符串。 例如,/a+/ 匹配 “candy” 中的 “a”,“caaaaaaandy” 中所有的 “a”。
n* 匹配任何包含零个或多个 n 的字符串。例如,/bo*/ 匹配 “A ghost booooed” 中的 “boooo”,“A bird warbled” 中的 “b”,但是不匹配 “A goat grunted”。
n? 匹配任何包含零个或一个 n 的字符串。例如,/e?le?/ 匹配 “angel” 中的 “el”,“angle” 中的 “le”。
n{X} 匹配包含 X 个 n 的序列的字符串。 例如,/a{2}/ 不匹配 “candy,” 中的 “a”,但是匹配 “caandy,” 中的两个 “a”,且匹配 “caaandy.” 中的前两个 “a”。
n{X,} X 是一个正整数。前面的模式 n 连续出现至少 X 次时匹配。 例如,/a{2,}/ 不匹配 “candy” 中的 “a”,但是匹配 “caandy” 和 “caaaaaaandy.” 中所有的 “a”。
n{X,Y} X 和 Y 为正整数。前面的模式 n 连续出现至少 X 次,至多 Y 次时匹配。 例如,/a{1,3}/ 不匹配 “cndy”,匹配 “candy,” 中的 “a”,“caandy,” 中的两个 “a”,匹配 “caaaaaaandy” 中的前面三个 “a”。注意,当匹配 “caaaaaaandy” 时,即使原始字符串拥有更多的 “a”,匹配项也是 “aaa”。
n$ 匹配任何结尾为 n 的字符串。
^n 匹配任何开头为 n 的字符串。
?=n 匹配任何其后紧接指定字符串 n 的字符串。
?!n 匹配任何其后没有紧接指定字符串 n 的字符串。
支持正则表达式的 String 对象的方法
方法 描述 FF IE
search 检索与正则表达式相匹配的值。 1 4
match 找到一个或多个正则表达式的匹配。 1 4
replace 替换与正则表达式匹配的子串。 1 4
split 把字符串分割为字符串数组。 1 4

回顾《JavaScript高级程序设计》目录

有用的话点个赞丫谢谢

posted on 2020-01-27 22:09  furfur-jiang  阅读(211)  评论(0编辑  收藏  举报