- 通常使用字面量
/
创建,例如:/^1\d{10}$/.test(17355476130)
,但如果含有变量,使用new RegExp(str,mode)
创建 - 正则
|
中竖线不是匹配单个字符,而是匹配两边的表达式,可以使用()
限定范围 - 原子表
[]
,代表匹配中括号中的任意一个字符,如匹配字母[a-zA-Z] - 原子组
()
,可以理解为一个整体的表达式 - 字符串中
'\d'==='d'
,\\d
才代表\d
-
\1
代表第一个原子组 - 中括号中
.
就是点,+
就是加,()
就是括号,\.
也是点 -
^
和$
分别代表匹配的起始和结束位置 -
^
也代表非,例如:/[\^\d]/.test("a")
- 模式修饰
-
i
:不区分大小写 -
g
:全局匹配 -
.
:不包括\n
,可以使用模式修饰\s
忽略换行,让.
也有换行 -
m
:将每一行单独处理,每一行都是一个独立的部分和正则匹配 -
u
:使用编码
- 元字符
-
\d,\D
:[0-9],[^0-9] -
\w,\W
:[A-Za-z0-9_],[^A-Za-z0-9_] -
\s,\S
:[\n\f\r\t\v],[^\n\f\r\t\v] -
[\s\S]
,[\d\D]
等代表匹配所有字符 -
\b,\B
:单词边界,非单词边
- 空格和普通字符一样可以直接使用空格
\ \
,也可以用\s
,但\s
会包含换行符 - 重复匹配,匹配的是前面的单个字符或组
-
*,+,?
:0-n,1-n,0-1 -
{n},{n,},{n,m}
:n,n-,n-m
-
*?
,+?
,??
,{n,m}?
,{n,}?
会禁止贪婪匹配 - 匹配中文的方法:
/\p{sc=Han}+/gu
或者/[\u4e00-\u9fa5]+/g
-
\t
代表制表位tab
,\n
代表换行,可以直接使用/\n/g
- 如果希望参与匹配但并不参与分组,可以使用
(?:
- 断言,可以理解为匹配的条件,即不参与匹配也不参与分组
-
x(?=exp)
零宽先行断言,x的后面必须出现exp -
(?<=exp)x
零宽后行断言,x的前面必须出现exp -
x(?!exp)
零宽负向先行断言,x的后面不能出现exp -
(?<!exp)x
零宽负向后行断言,x的前面不能出现exp
- 字符串方法(参数均可为正则或字符串)
-
search
:返回匹配的位置。 -
match
非全局会返回细节,否则返回数组,使用matchAll
或者exec
可以实现批量匹配细节,eg:[..."123".matchAll(/\d/g)]
。 -
split
可以使用字符串或者正则分割字符串。 -
replace
替换操作,可以替换为$,本身,左,右,N,还可以使用回调函数,以此参数为match子串,匹配项$n,偏移量offset,原字符串string。使用replaceAll
可以实现批量替换。
console.log("张三出生2000年6月,今年22岁了".search(/\d+/))
// 输出:4
console.log("张三出生2000年6月,今年22岁了".match(/\d+/))
// 输出:['2000', index: 4, input: '张三出生2000年6月,今年22岁了', groups: undefined]
console.log("张三出生2000年6月,今年22岁了".match(/\d+/g))
// 输出:['2000', '6', '22']
console.log("张三出生2000年6月,今年22岁了".split(/\d+/))
// 输出:"张三出生2000年6月,今年22岁了".split(/\d+/)
console.log("张三出生2000年6月,今年22岁了".replace(/\d+/,"*"))
// 输出:'张三出生*年6月,今年22岁了'
console.log("张三出生2000年6月,今年22岁了".replace(/\d+/g,""))
// 输出:'张三出生*年*月,今年*岁了'
console.log("张三出生2000年6月,今年22岁了".replace("0","*"))
// 输出:'张三出生2*00年6月,今年22岁了'
console.log("张三出生2000年6月,今年22岁了".replaceAll("0","*"))
// 输出:'张三出生2***年6月,今年22岁了'
- 正则方法
-
test
: 检测一个字符串是否匹配某个模式,匹配则返回ture,不匹配则返回false -
exec
:类似match
,可以循环调用直到匹配结果为空结束(如此反复),通过lastIndex
可以改变匹配起始位置,一定要在全局匹配模式下使用
console.log(/^\d{11}$/.test(12345678910)) //匹配手机号,输出:true
console.log(/^\d{11}$/.test("12345678910")) //匹配手机号,输出:true