定义
正则表达式是一种字符串匹配模式
语法
- 可见字符:
- \d:匹配数字0-9
- \w:匹配可见字符:字母、数字、下划线
- .:代表除换行符(\n、\r)以外的其它单字符
- 非可见字符:
- \s:匹配空白符
- \S:匹配非空白符
- \f:匹配换页符
- \n:匹配换行符
- \r:匹配回车符
- \t:匹配制表符
- \v:匹配垂直制表符
- \c+x:匹配控制字符
- \cL:换页符
- \cJ:换行符、回车符
- \cI:制表符
- \cK:垂直制表符
- 特殊预留字符:
- $:结尾位置
- ^:代表匹配的开始位置或者取反(^a代表除了a以外的其它字符)
- g:全局匹配:全局匹配意味着尽可能多次的匹配符合规则的内容,不加全局可能匹配到符合规则的一个就结束了,加了全局以后会匹配到最后
- i:忽略大小写
- m:多行匹配
- ():小括号中的内容为一组内容
- {n}、{n,m}、{n,}:限定符表达式内容
- 限定符:
-
*:表达式的零次或多次
-
+:表达式的一次或多次
-
?:表达式的零次或一次
-
|:二选一
ps:限定符都是贪婪匹配,即尽可能多次的匹配。使用?操作符实现最小匹配。
- 定位符:
- \b:单词的前后边界
- \B:非边界
- exp1(?=exp2):匹配exp2前面是exp1的场景
- exp1(?!exp2):匹配exp2前面不是exp1的场景
- (?<!exp2)exp1:匹配exp2后面不是exp1的场景
- (?<=exp2)exp1:匹配exp2后面是exp1的场景
注意
- match数组的第一个返回值是返回符合整个匹配规则的内容,其次如果匹配规则进行了分组匹配,则还会依次返回符合各组匹配规则的内容。
- 使用全局匹配后,match返回值数组不再包含匹配各分组规则的内容
举例:
let str2 = 'https://www.zhaowa.com:8080/session/sessionPage.html';
let pattern1 = /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/
console.log(str2.match(pattern1))
//不加全局匹配,打印如下:
[
'https://www.zhaowa.com:8080/session/sessionPage.html', //第一个返回值是符合整个匹配规则的内容
'https',//符合第一个分组规则的内容
'www.zhaowa.com',//符合第二个分组规则的内容
':8080', //符合第三个分组规则的内容
'/session/sessionPage.html', //符合第四个分组规则的内容
index: 0, input: 'https://www.zhaowa.com:8080/session/sessionPage.html', groups: undefined]
let pattern2 = /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/g
console.log(str2.match(pattern2))
//加全局匹配,打印如下:
['https://www.zhaowa.com:8080/session/sessionPage.html']
常用的匹配规则
1、手机号
规则:第一位是1、第二位只能是3456789(不一定,按照场景具体分析)、剩余9位无限制
let pattern = /^1[3-9]\d{9}$/
2、身份证号
规则:15位/18位;18位比15位多了出生年份的前两位数和最后一位的校验码;出生年份是1800-3999
前六位为地区码:[1-9]\d{5}
出生年份的前两位:(18|19|[23]\d{2})
出生年份后两位:(\d{2})
出生月份:((0[1-9])|1[0-2])
出生日期:([0-2][1-9]|10|20|30|31)
三位顺序码:([0-9]{3})
一位校验码:[0-9xX]
18位:/^([1-9]\d{5})(18|19|[23]\d{2})(\d{2})((0[1-9])|1[0-2])([0-2][1-9]|10|20|30|31)([0-9]{3})[0-9xX]$/
15位:/^[1-9]\d{5}(\d{2})((0[1-9])|1[0-2])([0-2][1-9]|10|20|30|31)([0-9]{3})/