RegExp

Javascript中生成正则表达式有两种,一种是使用字面量形式即/regexp/分隔符,一种是使用RegExp构造函数。

  1. // 常量形式,使用正则文字,不需要考虑字符串转义
  2. let pattern = /\d+/
  3. // 指定匹配模式
  4. let pattern = /\d+/mg
  5. // RegExp构造函数有两种形式:直接使用分隔符和正则文字表示,如果使用第二个参数指定匹配模式,则会覆盖前面的正则文字表达式里的匹配模式;或者在以字符串作为参数,这时候必须考虑字符串转义,通过第二个参数指定匹配模式
  6. let pattern = new RegExp(/\d+/mg)
  7. let pattern = new RegExp('\\d+','mg')

注意:推荐优先使用字面量形式,这样不仅语法简单,执行效率也高,因为js引擎在代码执行前会对它们进行预编译和缓存;当需要在运行时动态创建正则表达式时,则使用构造函数的方式。

  1. let name = 'messi'
  2. let namePattern = new RegExp('\\b'+name+'\\b','ig')
  3. let matchs = someText.match(namePattern,'ig')

正则表达式对象存储了5个状态变量

变量 说明
global 只读,标识正则表达式是否指定了全局模式
ignoreCase 只读,标识正则表达式是否指定了不区分大小写模式
multiline 只读,标识正则表达式是否指定了多行模式
source 只读,保存文本形式的表达式
lastIndex 读写,如果指定了全局模式,正则表达式的匹配就会从lastIndex的位置开始,并且在每次匹配成功后重新设定lastIndex。这样,就可以在字符串中重复迭代,一次寻找各个匹配结果。但是,如果对不同的字符串调用同一个正则表达式的exec()和test()方法,则需要将其lastIndex属性显式的置为0。如果不指定全局模式,则lastIndex一直为0.

regexp.exec(string)

这个方法用来在字符串中寻找匹配,如果成功,则返回表示匹配信息的数组,否则返回null,无论是否指定全局模式,该方法都返回单词匹配的结果。

  1. let pattern = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/g
  2. let str = '2020-10-03 2010-09-30'
  3. console.log(pattern.exec(str))

WechatIMG4100.png

  1. let pattern = /\d{4}-\d{2}-\d{2}/g
  2. let str = '2020-10-03 2010-09-30'
  3. let matchArray = null
  4. while ((matchArray = pattern.exec(str)) != null) {
  5. console.log(`${matchArray[0]} starts at ${matchArray.index} and ends at ${pattern.lastIndex}`)
  6. }
  7. // 2020-10-03 starts at 0 and ends at 10
  8. // 2010-09-30 starts at 11 and ends at 21

regexp.test(string)

这个方法用来测试正则表达式能否在字符串中找到匹配,返回布尔值。如果要验证整个字符串能否由字符串匹配,则需要在正则表达式两端加上^和$。此方法和exec()一样,都需要注意全局模式下,lastIndex问题。

  1. /\d{4}-\d{2}-\d{2}/.test('2020-10-05') // true

string.match(regexp)

这个方法类似与RegExp.prototype.exec(string),两者的区别是无论是否指定全局模式,exec方法总是返回单次匹配的结果,而match在非全局模式下和exec一样返回单次匹配的结果,在全局模式下返回一个各次匹配成功的文本的字符串数组。

  1. let pattern = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/
  2. let str = '2020-10-03 2010-09-30'
  3. console.log(str.match(pattern))

WechatIMG4101.png

  1. let pattern = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/g
  2. let str = '2020-10-03 2010-09-30'
  3. console.log(str.match(pattern))

WechatIMG4102.png

string.search(regexp)

这个方法用来寻找正则表达式在字符串中第一次匹配成功的位置,如果不成功,返回-1。即便设定了全局模式,也只会返回第一次匹配成功的位置。

string.replace

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replace

  1. let pattern = /(\d{4})-(\d{2})-(\d{2})/g
  2. let str = '1991-09-30 2020-10-05'
  3. str.replace(pattern,'$3/$2/$1')
  4. // 30/09/1991 05/10/2020
  1. let pattern = /\d+\.\d{0,2}/
  2. let str = 'The price is 12.99'
  3. str.replace(pattern,(r)=> `$${r}`)
  4. // The price is $12.99

string.split(regexp/string,limit)

这个方法使用正则表达式(或者字符串)来切分字符串为一个数组,可以指定第二个可选参数,表示返回数组的长度。

  1. 'one two three'.split(/\s+/) // ['one','two','three']