2022-08-23
阅读:93
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
修饰符 | 含义 | 描述 |
---|---|---|
i | 不区分大小写 | |
g | 全局匹配 | 查找所有的匹配项 |
m | 多行匹配 | 使^ 与$ 匹配每一行的结尾,而不是匹配字符串的开头与结尾 |
s | 特殊字符. 包含换行符\n |
默认情况下. 是匹配除换行符\n 之外的任何字符,加上s 修饰符,可以匹配换行符\n |
*、+、?、{n}、{n,}、{n,m}
a* 匹配a出现0次或多次
a+ 匹配a出现1次或多次
a? 匹配a出现0次或一次
a{n} 匹配a出现n次
a{n,} 匹配a至少出现n次
a{n,m} 匹配a至少出现n次,最多出现m次
或运算符
|
a|b 匹配a或者b
(ab)|(cd) 匹配 ab或者cd
![]()
字符类
[abc]、[^abc]、[a-z]、[A-Z]、[0-9]
[abc] 匹配方括号中的任意字符,a或者b或者c
[^abc] 匹配除了方括号中的字符
[a-z] 匹配小写字母a-z的所有字母
[A-Z] 匹配大写字母A-Z的所有字母
[0-9] 匹配0-9的所有数字
[a-zA-Z0-9] 匹配所有大小写字母以及0-9的所有数组
元字符
\d、\D、\w、\W、\s、\S、.、\b、^、$
\d
匹配一个数字字符。等价于 [0-9]
\D
匹配一个非数字字符。等价于 [^0-9]
\w
匹配字母、数字、下划线。等价于'[A-Za-z0-9_]'
\W
匹配非字母、数字、下划线。等价于 '[^A-Za-z0-9_]'
\s
匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]
\S
匹配任何非空白字符。等价于 [^ \f\n\r\t\v]
.
匹配除换行符(\n、\r)之外的任何单个字符
\b
匹配一个单词边界,也就是指单词和空格间的位置
^
匹配输入字符串的开始位置
$
匹配输入字符串的结束位置
分组
//连续匹配两个 abc
let reg = /(abc){2}/
// ==> abcabc
分支结构
//匹配 abc 或者 bcd
let reg = /(abc|bcd)/
//==> abcbcd
提取数据
比如:提取年月日
let reg = /(\d{4})-(\d{2})-(\d{2})/
let date = "2022-08-19"
console.log(date.match(reg))
match
方法返回的是一个数组,第一个元素是整体匹配的结果,然后是各分组(括号内的)匹配的内容,索引,输入的内容等。另外,正则表达式是否有修饰符g
,match
返回的数组格式是不一样的。
替换
比如,想把yyyy/mm/dd格式,替换成mm-dd-yyyy
let reg = /(\d{4})\/(\d{2})\/(\d{2})/
let date = "2022/08/19"
date = date.replace(reg,"$2-$3-$1")
console.log(date) // 08-19-2022
还以日期格式为例,比如,要匹配 2022-08-19 或者 2022/08/09 ,中间分隔符可以是 - 或者是/,但是要保持一致
let reg = /\d{4}(-|\/)\d{2}\1\d{2}/
console.log(reg.test('2022-08/19')) //false
console.log(reg.test('2022-08-19')) //true
console.log(reg.test('2022/08/19')) //true
注意里面的
\1
,表示引用第一个分组(-|\/)
。不管它匹配到什么,都匹配那个同样具体的字符以此类推,
\2
\3
的概念就能理解了
以左括号(开括号)为准。比如
let reg = /^((\d)(\d(\d)))\1\2\3\4$/
let str = '1231233'
console.log(reg.test(str))//true
之前的括号,都会捕获它们匹配到的数据,以便后续引用,因此,也称它们是捕获型分组和捕获型分支。
如果只是想要括号原始的功能,但不会引用他,即不在API里引用,也不在正则里反向引用,此时,可以使用非捕获括号
(?:p)
和(?:p1|p2|p3)