创建
方法一:字面量创建
var reg1 = /\d/
方法二: 通过 new 来声明
var reg2 = new RegExp('\d')
修饰符
通过这个例子发现,正则只匹配了第一个数字,后面的数字都没有被匹配
var str = "0q3g1";
str.replace(reg1, 'X') //Xq3g1
str.replace(reg2, 'X') //Xq3g1
如果我们想要匹配全部的数字该怎么办呢?我们可以通过修饰符来指定正则匹配的范围,修饰符有下面几种:
- g: global 全文搜索,添加这个修饰符将会匹配文本中所有可以匹配的字符
- i: ignore case 忽略大小写,添加以后将会同时匹配大写和小写
- m: multiple lines 多行匹配,当文本中有换行符时,通过这个修饰符可以匹配到下面几行的内容
var reg1 = /\d/g
var reg2 = new RegExp('\d','g')
str.replace(reg1, 'X') //XqXgX
str.replace(reg2, 'X') //XqXgX
如果要同时使用多个修饰符的话,可以将修饰符连写,像这样 /\d/gim
正则对象方法
test(String) 测试字符串中是否有符合正则表达式规则的文本
const regE = /\d/
const regF = /\d/g
regE.test('1') // true
regE.test('a23') // true
regF.test('12') // true
regF.test('12') // true
regF.test('12') // false
上面的 demo 中会看到只要字符串中含有了数字,test() 就会返回 true,但是比较奇怪的是,regF在第三次调用test()时返回了false,这是因为属性lastIndex 在这里起了作用:
当第一次匹配时,匹配的字符是1,此时lastIndex=1,下一次匹配时就会从 index 为 1 的字符开始匹配(起始未0)
第二次匹配时,匹配字符是2,此时lastIndex=2
第三次匹配时,由于 index=2 的位置上没有字符,匹配不到数字,就会返回 false 了
exec(String) 使用正则的规则对字符串进行搜索,如果有匹配的文本则返回结果数组,没有则返回 null
const regG = /\d/
const regH = /\d/g
regG.exec('12') // ["1", index: 0, input: "12"]
regG.exec('12') // ["1", index: 0, input: "12"]
regH.exec('12') // ["1", index: 0, input: "12"]
regH.exec('12') // ["2", index: 1, input: "12"]
regH.exec('12') // null
返回的数组中 index 属性为当前匹配到的字符的初始位置
字符串方法
search() 可传入字符串或正则,这个方法不执行g修饰符,返回第一个匹配的字符位置,找不到返回-1
var str = "hello world";
console.log(str.search("h"));//0
console.log(str.search("0"));//-1
match() 可传入正则或字符串,如果匹配到了返回数组,未匹配到返回 null
var str = "hello world";
var arr = str.match("hello");
console.log(arr);//["hello", index: 0, input: "hello world", groups: undefined]
split() 可传入正则或字符串,分割字符串
replace() 可传入正则或字符串,替换指定的文本;第二个参数可以是需要替换上的字符串,或者是一个返回字符串的回调函数,这个函数的参数有四种,依次是:
1.匹配到的字符串
2.正则的分组内容,如果没有分组就没有这个参数(如果有多个分组,就有多个对应的参数)
3.匹配的字符串的 index
4.原字符串
var url = "rsv_sug3=28&inputT=22113&rsv_sug4=22113";
console.log(url.replace(/=(\d+)/g, function(kw, group1, index) {
console.log(kw, group1, index);
return group1;
}));