2. 正则表达式
-
创建正则表达式
-
使用构造函数
var reg = new("正则表达式","匹配模式");
-
使用字面量
var reg = /正则表达式/gi;
g表示全局匹配
i表示忽略大小写
-
-
全局模式
全局模式是每次测试都是从
lastIndex
开始测试不是全局模式的话,每次测试都是从开头开始测试
lastIndex
是指下一次从哪个索引开始操作lastIndex
属性是正则表达式的
//全局模式 var str = "abcytABCfjAbc"; var reg = new RegExp("abc","gi"); console.log(reg.lastIndex); //0 console.log(reg.test(str)); //true console.log(reg.lastIndex); //3 console.log(reg.test(str)); //true console.log(reg.lastIndex); //8 console.log(reg.test(str)); //true console.log(reg.lastIndex); //13 console.log(reg.test(str)); //false // 因为测试到了最后,已经没有符合条件的了,再测的话就又是从头开始测 //不是全局模式 var str = "abcytABCfjAbc"; var reg = /abc/i; console.log(reg.lastIndex); //0 console.log(reg.test(str)); //true console.log(reg.lastIndex); //0 console.log(reg.test(str)); //true console.log(reg.lastIndex); //0 console.log(reg.test(str)); //true console.log(reg.lastIndex); //0 console.log(reg.test(str)); //true var str = "abc"; var reg = /abc/gi; console.log(reg.test(str)); // true console.log(reg.lastIndex); //这个值已经变成了3,所以下次测试一定是从下标为3的开始测,(不管字符串是否改变) console.log(reg.test("abc")); //false 因为这次从下标3开始测 console.log(reg.test("abc"));
2.1 exec
方法
exec
方法是将符合正则表达式要求的字符串中的子字符串抽取出来,
返回的是一个数组,一个是抽取出来的子串,另外里面有4个属性:groups index input length
index
表示抽取到的子串开头位置的索引
每次只抽取一个子串(除去分组之类的)
如果是有分组的情况:
var x = /boy(BOY)/ig; var s = "Boyboy"; console.log(x.exec(s)); //"Boyboy" "boy" var pa = /girl(Girl)/gi; var test = "girlGirlabdfjla Girlgirl fal girl"; var girls = pa.exec(test); console.log(girls); //girlGirl Girl console.log(pa.exec(test)); //Girlgirl girl console.log(pa.exec(test)); //null
2.2 正则表达式的一些语法
[]只匹配一个 [ab] 表示a或b [^a] 表示非a [^ab] 表示非a并且非b 只有在[]中^才表示非 ^ 表示以什么开头 $ 表示以什么结尾 ^$有开头有结尾来控制数量 [a-z] 小写字母 [0-9] 数字 \d 表示任意数字 \D 表示非数字 \w 表示任意单词字符 数字 字母 下划线 \W 表示非任意单词字符 \s 表示空白字符 空格 换行 制表符 回车\r \S 表示非空白字符 . 表示任意字符 \. 使用\转义, 就是普通的. 数量词: + 表示一个或多个 (abc)+ 表示至少一个abc * 表示0个或多个 ? 表示0个或1个 {n} 表示只能n个 {n,} 表示至少n个 {n,m} 表示至少n个至多m个
2.3 贪婪模式与懒惰模式
只有数量词才有贪婪或懒惰这个概念
默认情况下都是贪婪模式 (尽量多匹配)
在量词后面添加一个?表示懒惰模式 (尽量少匹配)
var str = "ab12345a123"; var reg = /(\d+)(\d+)(\d+)/gi; //"12345" "123" "4" "5" console.log(reg.exec(str)); //优先满足前面的组 var reg = /\d*/gi; console.log(reg.exec(str)); //*是会全部都取出来然后再一个一个慢慢往外吐,就吐到只剩下空串就匹配空串了
2.4 字符串中与正则有关的方法
-
search(正则表达式) 返回的是匹配到字符串中第一个满足条件的索引 没有找到则返回-1
-
match(正则表达式) 找到的是满足条件的所有子字符串,将他们放入一个数组中返回 不支持分组
-
replace(正则表达式,替换成什么字符串) 找到满足条件的子字符串,然后将他们替换成参数二的字符串
-
split(正则表达式) 在满足条件的地方切割字符串
var s = "我要吃吃吃吃饭饭啦"; var ss = s.replace(/(.)\1+/gi, "$1"); //正则搜索出来的首先是吃吃吃吃 然后替换成吃 再是饭饭,替换成饭 //\1指的是第一组的内容是什么,那么\1就是什么 var str = "我要吃吃吃吃饭饭啦" var reg = /(.)\1+/gi; console.log(reg.exec(str)) //"吃吃吃吃" "吃" console.log(reg.exec(str)) //"饭饭" "饭"