Javascript中的正则表达式——正则对象

声明一个正则对象,与声明一个字符串、数组、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() 可传入正则或字符串,替换指定的文本;第二个参数可以是需要替换上的字符串,或者是一个返回字符串的回调函数,这个函数的参数有四种,依次是:

  1. 匹配到的字符串
  2. 正则的分组内容,如果没有分组就没有这个参数(如果有多个分组,就有多个对应的参数)
  3. 匹配的字符串的 index
  4. 原字符串
Javascript中的正则表达式——正则对象_第1张图片
扫码关注前端周记公众号

你可能感兴趣的:(Javascript中的正则表达式——正则对象)