以下为学习《JavaScript 高级程序设计》》(第 3 版) 所做笔记。
目录:
1、创建正则表达式
1. 以字面量形式创建正则表达式
var expression = / pattern / flags;
pattern 部分是正则表达式。flags部分是标志,用以标明正则表达式的行为,正则表达式的匹配模式支持3个标志(g、i 跟 m)。
1 <script> 2 //g 3 //表示全局模式 4 //模式将被应用于字符串,而非发现第一个匹配项就停止。 5 var pattern1 = /at/g; //匹配字符串中所有"at"的实例 6 //i 7 //表示不区分大小写 8 //在确定匹配模式时忽略模式和字符串的大小写 9 var pattern2 = /[bc]at/i; //匹配第一个"bat"或"cat",不区分大小写 10 var pattern3 = /.at/gi; //匹配字符串中所有以"at"结尾的3个字符的组合,不区分大小写 11 //m 12 //表示多行模式 13 //在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项 14 </script>
在模式 pattern 中如果想要匹配元字符,需要对元字符进行转义。正则表达式中元字符有:( [ { ^ $ | ) ? * + . }
1 <script> 2 var pattern1 = /[bc]at/i; //匹配第一个"bat"或"cat",不区分大小写 3 var pattern2 = /[bc]at/i; //匹配第一个"[bc]at",不区分大小写 4 </script>
2. 使用 RegExp 构造函数创建正则表达式
RegExp 构造函数接收的第一个参数为模式 pattern, 第二个参数为标志 flags。
1 <script> 2 var pattern = new RegExp( "[bc]at", "i" ); 3 </script>
在模式 pattern 中如果想要匹配元字符,需要对元字符进行双重转义。例如字面量形式的模式 /w\hello\123/ 等同于 RegExp 构造函数的模式参数 " \w\\hello\\123 "。
3.使用字面量形式创建正则表达式与使用 RegExp 构造函数创建正则表达式的区别
使用正则表达式字面量必须像直接调用 RegExp 构造函数一样,每次都创建 RegExp 实例。在循环体中,使用字面量形式创建正则表达式实际上只会创建一个实例,不会每次循环都创建一个新实例,比如说第二次循环调用就是从上一次匹配的末尾开始的,不会从头开始匹配。
RegExp 实例属性
RegExp 的每个实例都有以下属性:global、ignoreCase、lastIndex、multiline、source
1 <script> 2 var pattern = /[bc]at/i; 3 var pattern2 = new RegExp( "\[bc\]at", "i" ); 4 //global 5 //布尔值 6 //表示是否设置了 g 标志 7 console.log( pattern.global ); //输出:false 8 console.log( pattern2.global ); //输出:false 9 //ignoreCase 10 //布尔值 11 //表示是否设置了 i 标志 12 console.log( pattern.ignoreCase ); //输出:true 13 console.log( pattern2.ignoreCase ); //输出:true 14 //lastIndex 15 //整数 16 //表示开始搜索下一个匹配项的字符位置,从0算起 17 console.log( pattern.lastIndex ); //输出:0 18 console.log( pattern2.lastIndex ); //输出:0 19 //multiline 20 //布尔值 21 //表示是否设置了 m 标志 22 console.log( pattern.multiline ); //输出:false 23 console.log( pattern2.multiline ); //输出:false 24 //source 25 //正则表达式的字符串表示 26 //按照字面量形式而非传入够早函数的字符串模式返回 27 console.log( pattern.source ); //输出:[bc]at 28 console.log( pattern2.source ); //输出:[bc]at 29 </script>
RegExp 实例方法
exec()
1 <script> 2 var text = "mom and dad and baby"; 3 var pattern = /mom( and dad( and baby)?)?/gi; 4 //lastIndex 5 //lastIndex 属性用于规定下次匹配的起始位置 6 console.log( pattern.lastIndex ); //输出:0 7 //exec() 8 //接收1个参数:要应用正则表达式的字符串 9 //有匹配项,则返回一个包含第一个匹配项的数组 10 //无匹配项,则返回 null 11 var matches = pattern.exec(text); 12 //index 13 //index是使用exec()方法后返回的数组的属性 14 //表示匹配项在数组中的位置 15 console.log( matches.index ); //输出:0 16 //input 17 //input是使用exec()方法后返回的数组的属性 18 //表示应用正则表达式的字符串 19 console.log( matches.input ); //输出:mom and dad and baby 20 //数组第一项:与整个模式匹配的字符串 21 console.log( matches[0] ); //输出:mom and dad and baby 22 //数组其它项:与模式中的捕获组匹配的字符串 23 console.log( matches[1] ); //输出: and dad and baby 24 console.log( matches[2] ); //输出: and baby 25 26 var text = "cat, bat, sat, fat"; 27 //模式不是全局模式,每次调用 exec()返回的都是第一个匹配项,lastIndex始终不变 28 var pattern = /.at/; 29 var matches = pattern.exec( text ); 30 console.log( matches.index ); //输出:0 31 console.log( matches[0] ); //输出:cat 32 console.log( pattern.lastIndex ); //输出:0 33 mathces = pattern.exec( text ); 34 console.log( matches.index ); //输出:0 35 console.log( mathces[0] ); //输出:cat 36 console.log( pattern.lastIndex ); //输出:0 37 //模式是全局模式,每次调用exec()都会返回字符串的下一个匹配项,lastIndex在每次调用exec()后都会变化 38 var pattern = /.at/g; 39 var matches = pattern.exec( text ); 40 console.log( matches.index ); //输出:0 41 console.log( matches[0] ); //输出:cat 42 console.log( pattern.lastIndex ); //输出:3 43 mathces = pattern.exec( text ); 44 console.log( matches.index ); //输出:0 45 console.log( mathces[0] ); //输出:bat 46 console.log( pattern.lastIndex ); //输出:8 47 </script>
test()
1 <script charset="utf-8"> 2 var text = "000-00-0000"; 3 var pattern = /d{3}-d{2}-d{4}/; 4 //test() 5 //接受1个字符串参数。在模式与该参数匹配的情况下返回 true 6 //经常用于验证用户输入 7 if( pattern.test( text ) ){ 8 console.log( "匹配" ); //输出:匹配 9 } 10 11 //RegExp实例继承的 toLocaleString() 和 toString() 方法都会返回正则表达式的字面量,与创建正则表达式的方式无关。 12 var pattern = new RegExp( "\[bc\]at", "gi" ); 13 console.log( pattern.toString() ); //输出:/[bc]at/gi 14 console.log( pattern.toLocaleString() ); //输出:/[bc]at/gi 15 </script>
1 <script> 2 var text = "Today is a happy day."; 3 var pattern = /(.)app/g; 4 var pattern2 = /(..)a(.)p(.)/g; 5 6 if( pattern.test( text ) ){ 7 //input : 最近一次要匹配的字符串 8 //$_ 等同于 input 9 console.log( RegExp.input ); //输出:Today is a happy day. 10 console.log( RegExp["$_"] ); //输出:Today is a happy day. 11 //lastMarch : 最近一次匹配项 12 //$& 等同于 lastMarch 13 console.log( RegExp.lastMatch ); //输出:happ 14 console.log( RegExp["$&"] ); //输出:happ 15 //lastParen :最近一次捕获组 16 //$+ 等同于 lastParen 17 console.log( RegExp.lastParen ); //输出:h 18 console.log( RegExp["$+"] ); //输出:h 19 //leftContext : input字符串中 lastMarch 之前的文本 20 //$` 等同于 leftContext 21 console.log( RegExp.leftContext ); //输出:Today is a 22 console.log( RegExp["$`"] ); //输出:Today is a 23 //rightContext : input字符串 lastMarch 之后的文本 24 //$' 等同于 rightContext 25 console.log( RegExp.rightContext ); //输出:y day. 26 console.log( RegExp["$'"] ); //输出:y day. 27 //multiline : 布尔值,表示是否所有表达式都是用多行模式 28 //$* 等同于 multiline 29 console.log( RegExp.multiline ); 30 console.log( RegExp["$*"] ); 31 } 32 33 //RegExp.$1、RegExp.$2......RegExp.$9 分别用于存储第一、第二。。。。。。第九个匹配的捕获组 34 if( pattern2.test(text) ){ 35 console.log( RegExp.$1 ); //输出: h 36 console.log( RegExp.$2 ); //输出:p 37 console.log( RegExp.$3 ); //输出:y 38 console.log( RegExp.$4 ); //输出:( 空字符串 ) 39 } 40 </script>