# 5.RegExp对象
1.使用
正则表达式(regular expression)是一种表达文本模式(即字符串结构)的方法,它有两种表达方法。一种是使用字面量,以斜杠表示开始和结束,另一种是使用RegExp构造函数。一般使用第一种方法。
let regex = /xyz/
let regex = new RegExp(/xyz/,'1')
正则对象生成以后,有两种使用方式:
正则对象的方法:将字符串作为参数,比如regex.test(string)。
字符串对象的方法:将正则对象作为参数,比如string.match(regex)。
2.正则对象的属性和方法
属性:
ignoreCase:返回一个布尔值,表示是否设置了i修饰符,该属性只读。
global:返回一个布尔值,表示是否设置了g修饰符,该属性只读。
multiline:返回一个布尔值,表示是否设置了m修饰符,该属性只读。
lastIndex:返回下一次开始搜索的位置。该属性可读写,但是只在设置了g修饰符时有意义。
source:返回正则表达式的字符串形式(不包括反斜杠),该属性只读。
方法:
test() 该方法返回一个布尔值,表示当前模式是否能匹配参数字符串。
exec() 返回匹配结果。如果发现匹配返回一个数组,成员是每个匹配成功的子字符串,否则返回null。
compile() 更改同变量名的正则规则
3.元字符
(1)点字符(.)
点字符(.)匹配除回车(\r)、换行(\n) 、行分隔符(\u2028)和段分隔符(\u2029)以外的所有字符。
(2)位置字符:位置字符用来提示字符所处的位置,主要有两个字符。^ 、$
(3)选择符(|):竖线符号(|)在正则表达式中表示“或关系”(OR),它要包含在小括号()里面
(4)
正则模式中,需要用斜杠转义的,一共有12个字符:^、.、[、$、(、)、|、*、+、?、{和\。需要特别注意的是,如果使用RegExp方法生成正则对象,转义需要使用两个斜杠,因为字符串内部会先转义一次。
(5)注意取反 ^和[]要同时出现,即[^a]
(6)
贪婪模式 (尽可能多的匹配)
'123456789'.match(/\d{3,5}/g) ["12345", "6789"]
非贪婪模式
'123456789'.match(/\d{3,5}?/g) 量词后面加上? ["123", "456", "789"]
(7)忽略分组,加上?:
(?:xx)()
(8)前瞻
// 正向前瞻 exp(?=assert)
// 负向前瞻 exp(?!assert)
(9)lastIndex指向当前最后一个匹配字符的索引+1,因为这个原因,使用test方法的时候尽量不要加g,否则可能得出不同的结果
(10) 正则非全局匹配结果返回的是一个数组,数组第一个元素是匹配表达式的元素,其它为子匹配元素
4.预定义模式:预定义模式指的是某些常见模式的简写方式。
\d 匹配0-9之间的任一数字,相当于[0-9]。
\D 匹配所有0-9以外的字符,相当于[^0-9]。
\w 匹配任意的字母、数字和下划线,相当于[A-Za-z0-9_]。
\W 除所有字母、数字和下划线以外的字符,相当于[^A-Za-z0-9_]。
\s 匹配空格(包括制表符、空格符、断行符等),相等于[\t\r\n\v\f]。
\S 匹配非空格的字符,相当于[^\t\r\n\v\f]。
\b 匹配词的边界。
\B 匹配非词边界,即在词的内部。
{n}重复多少次,{n,}最少n次,{0,n}最多n次
5.量词符:量词符用来设定某个模式出现的次数。
?问号表示某个模式出现0次或1次,等同于{0, 1}。*星号表示某个模式出现0次或多次,等同于{0,}。+加号表示某个模式出现1次或多次,等同于{1,}。
6.正则的反向调用:
- replace反向调用直接用$1 ,如replace的第二个参数可以是一个function,function参数的含义如下

// no group
'adkdk4'.replace(/\d/g,function($1,$2,$3,$4){
console.log($1) // 4
console.log($2) // undefined
console.log($3) // 5
console.log($4) // adkdk4
return $1+$2+$3+$4
})
//group
'adkdk4'.replace(/(\d)/g,function($1,$2,$3,$4){
console.log($1) // 4
console.log($2) // 4
console.log($3) // 5
console.log($4) // adkdk4
return $1+$2+$3+$4
})
test方法中的反响调用用RegExp.$1
export function formatDate (date,fmt) {
if (/(y+)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, (date.getFullYear()+'').substring(4-RegExp.$1.length))
}
let o={
'M+':date.getMonth()+1,
'd+':date.getDate(),
'h+':date.getHours(),
'm+':date.getMinutes(),
's+':date.getSeconds()
}
// 循环要用for in
for (let k in o) {
// 注意new RegExp通过反引号赋值的时候,反引号里面的内容要用小括号
if (new RegExp(`(${k})`).test(fmt)) {
let str=o[k]+''
fmt=fmt.replace(RegExp.$1, (RegExp.$1.length===1?str:padLeftZero(str)))
}
}
return fmt
}
7.正则帮助网站 https://regexper.com/