RegExp
Javascript中生成正则表达式有两种,一种是使用字面量形式即/regexp/分隔符,一种是使用RegExp构造函数。
// 常量形式,使用正则文字,不需要考虑字符串转义
let pattern = /\d+/
// 指定匹配模式
let pattern = /\d+/mg
// RegExp构造函数有两种形式:直接使用分隔符和正则文字表示,如果使用第二个参数指定匹配模式,则会覆盖前面的正则文字表达式里的匹配模式;或者在以字符串作为参数,这时候必须考虑字符串转义,通过第二个参数指定匹配模式
let pattern = new RegExp(/\d+/mg)
let pattern = new RegExp('\\d+','mg')
注意:推荐优先使用字面量形式,这样不仅语法简单,执行效率也高,因为js引擎在代码执行前会对它们进行预编译和缓存;当需要在运行时动态创建正则表达式时,则使用构造函数的方式。
let name = 'messi'
let namePattern = new RegExp('\\b'+name+'\\b','ig')
let matchs = someText.match(namePattern,'ig')
正则表达式对象存储了5个状态变量
变量 | 说明 |
---|---|
global | 只读,标识正则表达式是否指定了全局模式 |
ignoreCase | 只读,标识正则表达式是否指定了不区分大小写模式 |
multiline | 只读,标识正则表达式是否指定了多行模式 |
source | 只读,保存文本形式的表达式 |
lastIndex | 读写,如果指定了全局模式,正则表达式的匹配就会从lastIndex的位置开始,并且在每次匹配成功后重新设定lastIndex。这样,就可以在字符串中重复迭代,一次寻找各个匹配结果。但是,如果对不同的字符串调用同一个正则表达式的exec()和test()方法,则需要将其lastIndex属性显式的置为0。如果不指定全局模式,则lastIndex一直为0. |
regexp.exec(string)
这个方法用来在字符串中寻找匹配,如果成功,则返回表示匹配信息的数组,否则返回null,无论是否指定全局模式,该方法都返回单词匹配的结果。
let pattern = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/g
let str = '2020-10-03 2010-09-30'
console.log(pattern.exec(str))
let pattern = /\d{4}-\d{2}-\d{2}/g
let str = '2020-10-03 2010-09-30'
let matchArray = null
while ((matchArray = pattern.exec(str)) != null) {
console.log(`${matchArray[0]} starts at ${matchArray.index} and ends at ${pattern.lastIndex}`)
}
// 2020-10-03 starts at 0 and ends at 10
// 2010-09-30 starts at 11 and ends at 21
regexp.test(string)
这个方法用来测试正则表达式能否在字符串中找到匹配,返回布尔值。如果要验证整个字符串能否由字符串匹配,则需要在正则表达式两端加上^和$。此方法和exec()一样,都需要注意全局模式下,lastIndex问题。
/\d{4}-\d{2}-\d{2}/.test('2020-10-05') // true
string.match(regexp)
这个方法类似与RegExp.prototype.exec(string),两者的区别是无论是否指定全局模式,exec方法总是返回单次匹配的结果,而match在非全局模式下和exec一样返回单次匹配的结果,在全局模式下返回一个各次匹配成功的文本的字符串数组。
let pattern = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/
let str = '2020-10-03 2010-09-30'
console.log(str.match(pattern))
let pattern = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/g
let str = '2020-10-03 2010-09-30'
console.log(str.match(pattern))
string.search(regexp)
这个方法用来寻找正则表达式在字符串中第一次匹配成功的位置,如果不成功,返回-1。即便设定了全局模式,也只会返回第一次匹配成功的位置。
string.replace
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replace
let pattern = /(\d{4})-(\d{2})-(\d{2})/g
let str = '1991-09-30 2020-10-05'
str.replace(pattern,'$3/$2/$1')
// 30/09/1991 05/10/2020
let pattern = /\d+\.\d{0,2}/
let str = 'The price is 12.99'
str.replace(pattern,(r)=> `$${r}`)
// The price is $12.99
string.split(regexp/string,limit)
这个方法使用正则表达式(或者字符串)来切分字符串为一个数组,可以指定第二个可选参数,表示返回数组的长度。
'one two three'.split(/\s+/) // ['one','two','three']