正则表达式
正则表达式
-
正则表达式:对字符串进行逻辑匹配运算的 内置对象
正则是对象类型
表达式作用: 对字符串进行匹配运算
-
作用场景: 表单验证(手机号,验证码,账号,邮箱等)
-
如何使用: 两个流程
(1)创建正则对象: let reg = new RegExp(/正则表达式/)
(2)调用正则对象test()方法: reg.test('要校验的字符')
true: 符合规则 false: 不符合规则
了解: 正则对象和 array 和 obj 一样,也有自己的字面量简写
数组: []
对象: {}
正则: /正则表达式/
元字符与原义文本字符
正则表达式语法由两部分组成:
-
原义文本字符 : 字符串本身的含义
-
元字符 : 改变了字符串本身的含义, 类似于js中的关键字
[] {} () . \ + ? * ^ $ | ?
字符类
[] : 字符类 。将某种特征的字符归为一类。
/[abc]/ : 将a 或 b 或 c这种字符归为一类
说人话 :只要有a b c任意一个字符即可
反向类
[^] : 反向类 。 将不是某种特征的字符归为一类。
/abc/ : 将不是a 或 不是b 或 不是c的字符归为一类
说人话 : 只要有除abc之外的任意一个字符即可
范围类
范围类 : 代表字符类的范围(实质是比较ASCII)
/[0-9]/ : 检测有没有数字字符
/[a-z]/ : 检测有没有小写字母
/[A-Z]/ : 检测有没有大写字母
范围类注意点:
(1)范围类可以连写
/[a-zA-Z0-9]/ : 检测字符串有没有字母或数字
(2)范围类是一个闭区间
/[5-8]/ : 检测有没有5-8之间的数据。 包含5和8
(3)范围类 右边 一定大于 左边
/[8-5]/ : 直接报错。 范围类一定是右边大于左边
/[8-90-5]/ : 可以的 。 包含8 9 0 1 2 3 4 5
预定义类
预定义类: 正则表达式提供好的用来匹配常见的字符类
预定义类 | 等价类 | 含义 |
---|---|---|
. | [^\r\n] | 除了回车和换行之外的所有字符 |
\d digit | [0-9] | 数字字符(只要有数字即可) |
\D | [^0-9] | 非数字字符(只要没有数字即可) |
\s space | [\f\n\r\t\v] | 空格字符 (只要有空白字符即可) |
\S | [^\f\n\r\t\v] | 非空白字符(只要没有有空白字符即可) |
\w word | [a-zA-Z_0-9] | 单词字符(字母、下划线、数字)(只要有字母、数字、下划线即可) |
\W | [^a-zA-Z_0-9] | 非单词字符(只要没有字母、数字、下划线即可) |
边界
严格匹配: ^字符串$
^abc$ : 含义是,字符串必须以a开头,中间必须是b,结尾必须是c. 边界不是检测字符串,而是检测位置的。
-
满足该条件的只有一个字符串: abc
/^abc/ : 开头边界。 检测字符串是不是a开头+bc(a开头位置,后面一定要是bc) ^ 单独使用就是开头边界。
/abc$/ : 结尾边界。 检测字符串是不是ac+c结尾(c结尾位置,前面一定要是ab) $ 单独使用就是结尾边界。
/abc/ : 原义文本字符。 检测字符串有没有abc (只要有abc连在一起的字符即可)
/[abc]/ : 字符类。 检测字符串是否有 a或b或c 其中之一(只要有a b c任意一个字符即可)
/abc/ : 反向类。 检测字符串是否有 不是a或 不是b或 不是c 任意字符(只要没有a b c任意一个字符即可)
/^abc$/ : 严格匹配。 满足该条件的只有一个字符串: abc
量词
量词 | 含义 |
---|---|
? | 出现零次或一次(最多出现一次) |
+ | 出现一次或多次(至少出现一次) |
* | 出现零次或多次(任意次) |
{n} | 出现n次 |
{n,m} | 出现n-m次 |
{n,} | 出现至少n次(>=n) |
// /\d?/ : 匹配 零次或一次(最多出现一次 <= 1)
console.log('1234567890abc'.replace(/\d?/,'X'))// X234567890abc
console.log('a1234567890abc'.replace(/\d?/,'X'))// Xa1234567890abc
// /\d+/ : 匹配 出现一次或多次(至少出现一次 >=1)
console.log('1234567890abc'.replace(/\d+/,'X'))// Xabc
console.log('a1234567890abc'.replace(/\d+/,'X'))// aXabc
// /\d*/ : 匹配 出现零次或多次(任意次)
console.log('1234567890abc'.replace(/\d*/,'X'))// Xabc
console.log('a1234567890abc'.replace(/\d*/,'X'))// Xa1234567890abc
// /\d{5}/ : 匹配5次
console.log('1234567890abc'.replace(/\d{5}/,'X'))// X67890abc
// /\d{5,8}/ : 匹配5-8次
console.log('1234567890abc'.replace(/\d{5,8}/,'X'))// X90abc
// /\d{5,}/ : 匹配>=5次
console.log('1234567890abc'.replace(/\d{5,}/,'X'))// Xabc
分组
() 在正则中有三种含义
-
分组 : 把多个字符归为一组,用于量词
-
提升优先级 : 让 | 只匹配小括号内部的字符,提升|的优先级
-
向引用(提取) : 正则会提取()内部匹配的数据存入$中,可以进行反向引用
/*
1.分组(): 把多个字符归为一组,用于量词
1.1 /love{3}/ : 含义 匹配 lov + e(3次)
* 默认情况下量词只能对 一个 字符生效
1.2 /(love){3}/ : 含义 匹配 (love) 三次
* 如果希望量词可以对 多个字符生效,就可以使用()将多个字符归为一组
*/
console.log(/love{3}/.test('lovelovelove123')) //false
console.log(/love{3}/.test('loveeee123')) //true
console.log(/(love){3}/.test('lovelovelove123')) //true
console.log(/(love){3}/.test('loveeee123')) //false
/*
2.提升优先级() :
2.1 /lo|ive/ : 含义 匹配 有 lo 或 ive
* | : 正则中|代表或的意思,对|两边所有的字符生效
2.2 /l(o|i)ve/ : 含义 匹配 l + o|i ve
* () 和 | 一起使用可以提升|的优先级
*/
console.log(/lo|ive/.test('lo123')) //true
console.log(/lo|ive/.test('ive123')) //true
console.log(/lo|ive/.test('love123')) //true
console.log(/l(o|i)ve/.test('lo123')) //false
console.log(/l(o|i)ve/.test('ive123')) //false
console.log(/l(o|i)ve/.test('love123')) //true
/*
3.反向引用 :
* 正则表达式在匹配的时候,会自动把()内部匹配到的数据提取到RegExp的$变量中。 ($1-$9)
* 此时可以可以在替换字符串的时候,通过调整$的顺序对字符串进行反向引用(调整字符串格式顺序)
*/
console.log('2021-11-21'.replace(/(\d{4})-(\d{2})-(\d{2})/, '$3/$2/$1'))//21/11/2021
console.log(RegExp.$1)//2021
console.log(RegExp.$2)//11
console.log(RegExp.$3)//21
/* 大陆: 年-月-日 2021-11-21
香港: 日/月/年 21/11/2021
*/
修饰符
1.修饰符 : 对正则表达式进行修饰作用,可以改变正则表达式结果
g : global,全局匹配
i : intensity,区分大小写
m : multiple,检测换行符。用于边界
2.修饰符语法: /正则表达式/修饰符
//1. g : 全局匹配
// /a/ : 匹配字符a
//(1)默认情况下,正则只能匹配第一个
console.log('a123A456aaa789AAA'.replace(/a/,'X'))// X123A456aaa789AAA
//(2)如果希望正则可以匹配所有的,就可以使用 g修饰符
console.log('a123A456aaa789AAA'.replace(/a/g,'X'))// X123A456XXX789AAA
//2. i : 不区分大小写
//(1)默认情况下,正则表达式区分大小写
console.log('a123A456aaa789AAA'.replace(/A/,'X'))// a123X456aaa789AAA
//(2)如果希望正则不区分大小写,就可以使用 i修饰符
console.log('a123A456aaa789AAA'.replace(/A/i,'X'))// X123A456aaa789AAA
/* 正则表达式修饰符是可以同时写多个的 */
console.log('a123A456aaa789AAA'.replace(/A/ig,'X'))// X123X456XXX789XXX
//3. m : 检测换行符。 需要和边界在一起使用
//m含义: 让边界 对换行符生效。 换行符后面的内容视为边界
let str = '我爱我的可乐\n我爱我的可乐\n我爱我的可乐'
console.log( str.replace(/^我/gm,'小明') )
console.log( str.replace(/(.+)我(.+)/gm,'$1小明$2') )//替换中间的我