正则表达式
regular expression : RegExp
什么是正则表达式
正则表达式用来处理字符串规则
- 只能处理字符串
- 是一个规则:可以验证字符串是否符合某个规则(test),也可以把字符串中符合规则的部分捕获到(exec / match ...)
let str = 'good good study, day day up!';
// 正则就是用来制定规则
let reg = /\d+/; // \d 代表0~9中的一个数字,+代表让其出现多次:是否包含数字
reg.test(str); // => false
str = "2020-11-18";
reg.exec(str); // => 把当前字符串中符合reg的捕获到:["2020", index: 0, input: "2020-11-18"]
编写正则表达式
创建方式
1、字面量方式
// 两个斜杠子件包起来的,都是用来描述规则的元字符
let reg = /\d+/;
2、基于构造函数模式
// 两个参数:元字符字符串, 修饰符字符串
let reg = new RegExp('\\d+'); // 需要加一个转义字符才能达到想要的效果
组成
- 元字符
- 修饰符
常用元字符
量词元字符:设置出现的次数
序号 | 字符 | 含义 |
---|---|---|
1 | * | 0到多次(可以出现,可以不出现) |
2 | + | 1到多次 |
3 | ? | 0次或1次 |
4 | {n} | 出现n次 |
5 | {n,} | 出现n到多次 |
6 | {n,m} | 出现n到m次(>=n,<=m) |
特殊元字符:单个或者组合在一起代表特殊的含义
序号 | 字符 | 含义 |
---|---|---|
1 | \ | 转义字符:普通->特殊->普通(来回相互转义) |
2 | . | 除 \n(换行符) 以外的任意字符 |
3 | ^ | 以哪一个元字符作为开始 |
4 | $ | 以哪一个元字符作为结束 |
5 | \n | 换行符 |
6 | \d | 0~9之间的一个数字 |
7 | \D | 非0~9之间的一个数字(大写和小写意思是相反的) |
8 | \w | 数字、字母、下划线中的任意一个字符 |
9 | \s | 一个空白字符(空格、制表符、换页符等) |
10 | \t | 一个制表符(一个tab键:四个空格) |
11 | x|y | x或者y中的一个字符 |
12 | [xyz] | x或者y或者z中的一个字符 |
13 | [^xy] | 除了x或者y以外的任意字符 |
14 | [a-z] | 指定a-z这个范围中的任意字符 |
15 | [^a-z] | 上一行中的取反(非) |
16 | () | 正则中的分组符号 |
17 | (?:) | 只匹配,不捕获 |
18 | (?=) | 正向预查 |
19 | (?!) | 负向预查 |
普通元字符:代表本身含义的
/abcd/ 此正则匹配的就是 “abcd”
正则表达式常用修饰符
i => ignoreCase 忽略单词大小写匹配
m => multiline 可以进行多行匹配
g => global 全局匹配
// 例===
/A/.test('aabbcc'); // => false
/A/i.test('aabbcc'); // => true
元字符详细解析
1、^ $
let reg = /^\d/; // 以数字开始
reg.test('aaa'); // => false
reg.test('2020aaa'); // => true
reg.test('aaa2020'); // => false
let reg = /\d$/; // 以数字结束
reg.test('aaa'); // => false
reg.test('2020aaa'); // => false
reg.test('aaa2020'); // => true
// => ^ $ 两个都不加:字符串中包含符合规则的内容即可
let reg1 = /\d/; // 包含数字
// => ^ $ 两个都加:字符串只能是和规则一致的内容
let reg2 = /^\d+$/;
// 例:验证手机号码(11位,第一个数字是1即可)
let reg = /^1\d{10}$/;
let reg = /^2.3$/; // .不是小数点,是除\n以外的任意字符
reg.test('2.3'); // => true
reg.test('2@3'); // => true
reg.test('23'); // => false
reg = /^2\.3$/; // 基于转义字符,让其只能代表小数点
reg.test('2.3'); // => true
reg.test('2@3'); // => false
reg.test('23'); // => false
let str = '\\d'; // 匹配这样一个字符串,这样写代表一个字符串"\d"
reg = /^\d$/; // \d 代表0-9的数字
reg.test(str); // => false
reg = /^\\d$/; // 转义字符把特殊符号转换为普通的字符
reg.test(str); // => true
2、x|y
let reg = /^18|29$/;
reg.test('18'); // => true
reg.test('29'); // => true
reg.test('129'); // => true
reg.test('189'); // => true
reg.test('1829'); // => true
reg.test('829'); // => true
reg.test('182'); // => true
// 直接x|y会存在很乱的优先级问题,一般写的时候都伴随着小括号进行分组,因为小括号改变处理的优先级
// 小括号 => 分组
reg = /^(18|29)$/; // 只能是 18 或者 29 中的一个
reg.test('18'); // => true
reg.test('29'); // => true
reg.test('129'); // => false
reg.test('189'); // => false
reg.test('1829'); // => false
reg.test('829'); // => false
reg.test('182'); // => false
3、[]
1、中括号中间出现的字符一般都代表本身的含义
2、中括号中不存在多位数
// 1、中括号中间出现的字符一般都代表本身的含义
let reg = /^[@+]+$/; // @或+中的任意一个出现1到多次
reg.test('@@'); // => true
reg.test('@+'); // => true
reg = /^[@+]$/;// @或+中的任意一个出现1次(只有1位)
reg.test('@'); // => true
reg.test('+'); // => true
reg.test('@@'); // => false
reg.test('@+'); // => false
reg = /^[\d]$/; // \d在中括号中还是0-9的数字
reg.test('d'); // => false
reg.test('\\'); // => false
reg.test('1'); // => true
reg = /^[\\d]$/; // \d在中括号中还是0-9的数字
reg.test('d'); // => true
reg.test('\\'); // => true
reg.test('1'); // => false
// 2、中括号中不存在多位数
reg = /^[18]$/; // 1 或 8,不是18
reg.test('1'); // => true
reg.test('8'); // => true
reg.test('18'); // => false
reg = /^[10-29]$/; // 1 || 0到2 || 9
reg.test('1'); // => true
reg.test('9'); // => true
reg.test('0'); // => true
reg.test('2'); // => true
reg.test('10'); // => false
reg = /^[(10-29)]$/; // ( || 1 || 0到2 || 9 || )
reg.test('('); // => true
reg.test(')'); // => true
reg = /^[\(10-29\)]$/; // ( || 1 || 0到2 || 9 || )
// \( => (
常用正则表达式
1、验证是否为有效数字
/**
* 规则分析:
* 1、可能出现 + - 号,也可能不出现。只能出现一位 => [+-]?
* 2、只有一位,0-9都可以,多位时首位不能为0 => (\d|[1-9]\d+)
* 3、小数部分可能有可能没有,如果有,后面必须有小数点加数字 => (\.\d+)?
*/
let reg = /^(+|-)?(\d|[1-9]\d+)(\.\d+)?$/;
let reg = /^[+-]?(\d|[1-9]\d+)(\.\d+)?$/;
2、验证密码
// 数字、字母、下划线
// 6-16位
let reg = /^\w{6,16}$/;
3、验证真实姓名
/**
* 规则分析:
* 1、汉字 => /^[\u4E00-\u9FA5]$/
* 2、名字长度 2~10位 => {2,10}
* 3、可能有译名(可能出现多次):·汉字 => (·[\u4E00-\u9FA5]{2,10})*
*/
// 例:奥克多·维克奇·林奥·拉布拉多
let reg = /^[\u4E00-\u9FA5]{2,10}(·[\u4E00-\u9FA5]{2,10})*$/;
4、验证邮箱
let reg = /^\w+((-\w+)|(\.\w+))*@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+/;
// => \w+((-\w+)|(\.\w+))*
// 1、开头是数字字母下划线(1到多位)
// 2、还可以是 “-数字字母下划线” 或者 “.数字字母下划线”,整体0到多次
// 3、邮箱的名字由“数字、字母、下划线、'-'、'.'”几部分组成,但是-/.不能连续出现也不能作为开始
// => @[A-Za-z0-9]+
// 1、@后面紧跟着:数字、字母(1到多位)
// => ((\.|-)[A-Za-z0-9]+)*
// 1、对@后面名字的补充
// 多域名
// 企业邮箱
// => \.[A-Za-z0-9]+
// 1、这个匹配的是最后的域名(.com/.cn/.org/.edu./.net/.vip等等)
5、身份证号码
/**
* 规则分析:
* 1、一共18位
* 2、最后一位可能是 X
*/
let reg = /^\d{17}(\d|X)$/;
// 身份证前6位:省市县
// 中间8位:年月日
// 最后四位:
// + 最后一位:X或者数字
// + 倒数第二位:偶数女,奇数男
// + 其余的是经过算法算出来的
// => 小括号分组的第二个作用:分组捕获,不仅可以把大正则匹配的信息捕获到,还可以单独捕获到每个小分组的内容
let reg = /^(\d{6})(\d{4})(\d{2})(\d{2})\d{2}(\d)(\d|X)$/;
reg.exec(身份证号码); // 捕获结果是数组,包含每一个小分组单独获取的内容
// 可以使用下面这种校验
reg = /^[1-9][0-9]{5}(18|19|(2[0-9]))[0-9]{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)[0-9]{3}[0-9Xx]$/;