1.背景
很多场景下,我们需要校验获取到的数据类型, 比如密码,手机号码,邮箱,金额等等;
有些场景下,用户输入一些特殊的字符,我们要需要过滤,或为了显示美观需要格式化等;
这样既可以规范数据,提高性能,又可以过滤一部分存在安全隐患的数据。这个时候,正则就可以很简单快捷的帮助我们做到。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
2.正则表达式
什么是正则表达式呢?
一张图来了解正则式表达式:
(1)^ 为匹配输入字符串的开始位置;
(2)[a-z0-9_-]为只允许包含字符、数字、下划线和连接字符(-);
(3){3,15}为匹配校验的字符串只能为3~15的长度;
(4)$ 为匹配输入字符串的结束位置。
这样就很容易理解正则表达式了,就是以^开始,以$ 结束,中间跟着校验的字符和位数。
下面体验一下:
let str1 = "123ab";//5位,低于6位,不匹配
let str2 = "123abc_-";//8位,只包含数字0-9,小写字母a-z,匹配
let str3 = "123abc_-!";//包含规则外的!字符,不匹配
let str4 = "123Abc_-!";//包含规则外的A字符,不匹配
let str4 = "123abc_-231abc";//14位,超过6~12位,不匹配
let patt1 = /^[a-z0-9-_]{6,12}$/;//只能包含小写字母a-z、0-9、_和-,并且只能6~12位。
console.log(patt1.test(str1));//false
console.log(patt1.test(str2));//true
console.log(patt1.test(str3));//false
console.log(patt1.test(str4));//false
console.log(patt1.test(str5));//false
可以自己试试~~~
附录:这里面有平时用到的表达式,建议有空看看
到这里基本可以看懂正则表达式了,
其他的正则的修饰符,方括号内表达式,元字符可以自己查找 JavaScript RegExp 对象参考手册。
下面做个简单的介绍
3.RegExp 对象
什么是 RegExp?
正则表达式描述了字符的模式对象。
当您检索某个文本时,可以使用一种模式来描述要检索的内容。RegExp 就是这种模式。
简单的模式可以是一个单独的字符。
更复杂的模式包括了更多的字符,并可用于解析、格式检查、替换等等。
您可以规定字符串中的检索位置,以及要检索的字符类型,等等。
3.1 语法
let patt=new RegExp(pattern,modifiers);
//或更简单的方法
let patt=/pattern/modifiers;
pattern:模式描述了一个表达式模型。
modifiers:修饰符(modifiers)描述了检索是否是全局,区分大小写等。
注意:当使用构造函数创造正则对象时,需要常规的字符转义规则(在前面加反斜杠 \)。比如,以下是等价的:
let patt= new RegExp("\\w+");
let patt= /\w+/;
3.2 RegExp 修饰符
修饰符用于执行不区分大小写和全文的搜索。
i - 修饰符是用来执行不区分大小写的匹配。
g - 修饰符是用于执行全文的搜索(而不是在找到第一个就停止查找,而是找到所有的匹配)。
m -修饰符是执行多行匹配。
//在字符串中不区分大小写找"runoob"
let str = "Visit RUnoob";
let patt1 = /runoob/i;
console.log(str.match(patt1));
//["RUnoob", index: 6, input: "Visit RUnoob", groups: undefined]
let str2="Is this all there is?";
let patt2=/is/g;
console.log(str2.match(patt2));//["is", "is"]
let patt3=/is/gi;
console.log(str2.match(patt3));["Is", "is", "is"]
3.3 方括号
方括号用于查找某个范围内的字符:
3.4 正向肯定预查
(?!pattern):正向肯定预查(look ahead positive assert),在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,"Windows(?=95|98|NT|2000)"能匹配"Windows2000"中的"Windows",但不能匹配"Windows3.1"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
let regx1 = /^(?![0-9]+$)/;
let str2 = "0123123";
let str3 = "0123aaa";
console.log(regx1.test(str2));//false
console.log(regx1.test(str3));//true
3.5 元字符
元字符(Metacharacter)是拥有特殊含义的字符:
3.7 量词
3.8 RegExp 对象方法
(1)test()
test()方法搜索字符串指定的值,根据结果并返回真或假。
let patt1=new RegExp("e");
console.log(patt1.test("The best things in life are free"));//true
(2)exec()
exec() 方法检索字符串中的指定值。返回值是被找到的值。如果没有发现匹配,则返回 null。
var patt1=new RegExp("e");
console.log(patt1.exec("The best things in life are free"));
//["e", index: 2, input: "The best things in life are free", groups: undefined]
3.9 支持正则表达式的 String 对象的方法
(1)search()
检索与正则表达式相匹配的值。
(2)match()
找到一个或多个正则表达式的匹配。
(3)replace()
替换与正则表达式匹配的子串。
(4)split()
把字符串分割为字符串数组。
网友评论