声明一个正则对象,与声明一个字符串、数组、Object 一样,可以通过字面量和 new 关键字来声明
// 字面量的声明方式 通过 //声明
const regA = /\d/
// 通过 new 来声明
const regB = new RegExp('\d')
上面两个正则将会匹配数字,用字符串的 replace
方法来测试一下:
const str = '0a1b3c'
str.replace(regA, 'X')
// 'Xa1b3c'
str.replace(regB, 'X')
// 'Xa1b3c'
通过这个例子发现,正则只匹配了第一个数字,后面的数字都没有被匹配,如果我们想要匹配全部的数字该怎么办呢?
修饰符
我们可以通过修饰符来指定正则匹配的范围,修饰符有下面几种:
g: global 全文搜索,添加这个修饰符将会匹配文本中所有可以匹配的字符
i: ignore case 忽略大小写,添加以后将会同时匹配大写和小写
m: multiple lines 多行匹配,当文本中有换行符时,通过这个修饰符可以匹配到下面几行的内容
const regC = /\d/g
const regD = new RegExp('\d', 'g')
str.replace(regC, 'X')
// 'XaXbXc'
str.replace(regD, 'X')
// 'XaXbXc'
如果要同时使用多个修饰符的话,可以将修饰符连写,像这样 /\d/gim
正则对象属性
global
ignoreCase
multiline
// 上面三个属性与三个标识符相对应,但是是只读属性,不能修改,当声明正则时添加了对应的修饰符,则对应的属性就会是 true
lastIndex: 当前表达式匹配内容的最后一个字符的下一个位置
source: 正则表达式的字符串文本 /[a-z]/ 的字符串文本就是 '[a-z]'
正则对象方法
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
修饰符,返回第一个匹配的字符位置
match() 可传入正则或字符串,如果匹配到了返回数组,未匹配到返回 null
split() 可传入正则或字符串,分割字符串
replace() 可传入正则或字符串,替换指定的文本;第二个参数可以是需要替换上的字符串,或者是一个返回字符串的回调函数,这个函数的参数有四种,依次是:
- 匹配到的字符串
- 正则的分组内容,如果没有分组就没有这个参数(如果有多个分组,就有多个对应的参数)
- 匹配的字符串的 index
- 原字符串