前言
正则在js中是一类比较特殊的对象,它可以匹配各个场景需要的格式验证,例如邮箱、手机号、用户登录名、密码等等,似乎无处不在,在常见的字符串检索或替换中,我们需要提供一种模式表示检索或替换的规则,来匹配一系列符合某个句法规则的字符串。
以下是正则的较为官方的解释:
正则表达式是用于匹配字符串中字符组合的模式。在
JavaScript
中,正则表达式也是对象。这些模式被用于RegExp
的exec
和test
方法, 以及String
的match
、replace
、search
和split
方法。
言归正传,上代码!
1. 创建正则表达式(以下有两种方式来参考):
(1)使用正则表达式的构造函数(new 的方式来创建)
let regex = new RegExp("a")let regex = new RegExp("^[a-zA-Z]",'g') ; //当使用引号时不必再加反斜杠’/’let regex = new RegExp(/^[a-zA-Z]/,'gi'); //当有斜杠时就 不用再加引号 复制代码
(2)创建字面量(由两个斜杠’//'包裹需要匹配的内容)
let regex = /ab/ ;let regex=/^[a-zA-Z]/ ;复制代码
这两种方式都可以来创建一个正则表达式,但是相对来说第二种方式更加常用一些。
2.正则表达式的参数,写在//后面,可混合使用
g
全局匹配;找到所有匹配,而不是在第一个匹配后停止i
匹配全部大小写m
多行; 将开始和结束字符(^
和$
)视为在多行上工作(也就是,分别匹配每一行的开始和结束(由\n
或\r
分割),而不只是只匹配整个输入字符串的最开始和最末尾处。s
与m
相反,单行匹配
let regex=/^[a-zA-Z]/gim ;复制代码
3. 正则中常用方法以及字符串中与正则相关的方法
(1)test
()方法检索字符串中的值是否匹配给出的正则规则,返回布尔值 true
或false
。
检索"ab"
是否匹配前面的正则表达式 /../,正确返回true
,不匹配返回false
/../.test("ab"); // true。 复制代码
(2)exec
()方法检索字符串中的指定值,如果找到匹配的文本,则返回一个结果的数组,反之返回null
。
检索正则表达式/abc/
是否有在字符串中defaabc
有匹配到,返回匹配到内容,索引值,以及检索的字符串
/abc/.exec("defaabc") // ["abc", index: 4, input: "defaabc"]复制代码
检索/qqq/
是否在abcdefaabc
中匹配到,返回 null
/qqq/.exec("abcdefaabc") // null复制代码
(3)compile()
方法用于改变正则匹配内容
将/abc/
的匹配内容改成后面的字符串的内容
/abc/.compile('def’) // /def/复制代码
(4)split()
将字符串分割成字符串数组
将字符串abcd
以/b/
中的b
分割成字符串数组
"abcd".split(/b/); // ["a", "cd"]复制代码
(5)replace()
方法用于在字符串中用一些字符替换另一些字符或者替换一个与正则表达式匹配的字符串
用正则内容/\d\d\d/
去匹配字符串12345abcde
,将匹配的内容替换成*
,并返回替换完成的字符串
'12345abcde'.replace(/\d\d\d/g,'*'); // "*45abcde"复制代码
去掉字符串的引号,全局检索'
,替换成''
空
'12345abcde'.replace(/'/g,''); //12345abcde复制代码
去掉左侧空格:
' 12666'.replace( /^\s*/, ''); //12666复制代码
去掉右侧空格:
'12666 '.replace(/(\s*$)/g, "") //12666复制代码
去掉两头空格:
' 12666 '.replace(/^\s+|\s+$/g,"") // 12666复制代码
同样除了正则,js也有去除两头空格的方法:
' 22 33 '.trim() //22 33复制代码
去掉字符串中所有的空格,tab
,换页符,换行符
' 12 345ab cd e '.replace(/\s/g,''); // "12345abcde"复制代码
(6) search()
用于检索字符串中指定的字符串或与正则表达式相匹配的字符串,返回匹配的字符串的起始位置的索引,反之返回-1
'abcdedfasdfs'.search(/d/); // 3复制代码
即使是全局匹配,也只会匹配到第一个的位置
'abcdedfasdfs'.search(/d/g); // 3复制代码
如果没有匹配到,返回-1
'abcdedfasdfs'.search(/o/g); // -1复制代码
(7)match()
方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配
检索指定的值,并返回,b+
指多个
"aabbbbccbbaab".match(/b+/g); // ["bbbb", "bb", "b"]复制代码
4.正则规则(常用)
参考:
(1)字符类规则
如果亲感觉示例代码并没有解除你的疑惑,那么接下来就来分条解释上面的每个字符的用法:
(1) . 任意字符
关于这个(.)
可能是匹配最多内容的字符了,它的匹配规则是除去换行(\n)
和回车(/r)
之外的任意字符,下面我们就来用几个示例来演示。
测试字母:
/.../.test("abc"); // true复制代码
测试数字:
/.../.test(123); // true复制代码
特殊符号:
/………../.test("!@#$%^&*()_+") // true复制代码
(2)\d 匹配数字0~9
测试字母:
/\d/.test("a"); // false复制代码
测试数字:
/\d/.test(5) //true复制代码
特殊符号:
/\d\d\d\d\d\d\d\d\d\d\d\d\d/.test("!@#$%^&*()_+") // false复制代码
(3)\D 匹配除数字0~9
的所有字符(非\d)
测试字母:
/\D/.test("a"); // true复制代码
测试数字:
/\D/.test(5) // false复制代码
特殊符号:
/\D\D/.test("!@") // true复制代码
(4)\w 匹配数字0~9
,字母a~z
,A~Z
,下划线
测试字母:
/\w/.test("a"); // true复制代码
测试数字:
/\w/.test(5) // true复制代码
特殊符号:
/\w\w/.test("!@") // false复制代码
(5)\W
匹配非\w
,的特殊符号
测试字母:
/\W/.test("a"); // false复制代码
测试数字:
/\W/.test(5) // false复制代码
特殊符号:
/\W\W/.test("!@") // true复制代码
(6)\s
匹配空格Tab
换页 换行符
测试字母:
/\s/.test("a"); // false复制代码
测试数字:
/\s/.test(5) // false复制代码
特殊符号:
/\s/.test("@") // false复制代码
空格Tab
:
/\s\s/.test(" ") //true复制代码
(7)\S
匹配非\s
的内容
测试字母:
/\S/.test("a"); // true复制代码
测试数字:
/\S/.test(5) // true复制代码
特殊符号:
/\S/.test("@") // true复制代码
空格Tab:
/\S\S/.test(" ") // false复制代码
(2)范围符号匹配规则
(1)[...]: 匹配字符范围之内的
/[a-z]/.test("asdfge") // true复制代码
(2)[^...]: 匹配字符范围以外的
/[^a-z]/.test("15432") // true复制代码
(3)^ :匹配以此开头的
/^abcd/.test("abcd") // true复制代码
(4)$:匹配以此结尾的
/abd$/.test("abd") // true复制代码
(5)\b:匹配单次边界
检测is
两侧是否有空格的,有空格的即可匹配,并且单次匹配
/is\b/.test("this is an apple") // true"th is is an apple".replace(/\bis\b/,"*") // "th * is an apple""th isis an apple".replace(/\bis\b/,"*") 复制代码
(6)\B:非\b,即非单次边界 检测abc
两侧是否都没有空格,单次匹配
"eabcdef abcde".replace(/abc\B/,"*") //"e*def abcde""e abc def abc de".replace(/abc\B/,"*") //"e abc def abc de""eabcdefabcde".replace(/abc\B/,"*") // "e*defabcde"复制代码
(3)分组匹配规则
(1)(x):分组并记录匹配到的字符串
"boyboyfrinedboy".replace(/(boy){2}frined/,"*") //"* boy"复制代码
(2) \x : \x匹配第x个分组(x)重复1次
/(abc)(def)\2/.test("abcdefdef") // true复制代码
(3) (?:x): 仅分组,此时的\x并不会指向此
/(?:abc)(?:def)(eee)\1/.test("abcdefeeeeee") // ture复制代码
(4)重复匹配规则
(1) x* :匹配x并匹配重复次数>=0的x(贪婪算法)
abc*匹配ab,abc,abcc,abccc 复制代码
(2) x+ :匹配x并匹配重复次数>0的x(贪婪算法)
abc*匹配abc,abcc,abccc,不匹配ab 复制代码
(3) x*? :只匹配x(不包含最后字符)(非贪婪算法)
abc*?只匹配ab,其他不匹配复制代码
(3) x+? :只匹配x,其他不匹配(非贪婪算法)
abc+?只匹配abc,其他不匹配复制代码
(4)x{n} :匹配x重复>=n次的内容(非贪婪算法)
(abc){2}匹配abcabc,abcabcabcabc复制代码
(5) x{n,m} :匹配x重复次数>=n,<=m(非贪婪算法)
(abc){1,2}匹配abc,abcabc,不匹配abcabcabc复制代码
5.常用的正则匹配
(1)手机号
-
移动号段: 134 135 136 137 138 139 147 148 150 151 152 157 158 159 172 178 182 183 184 187 188 198
-
联通号段: 130 131 132 145 146 155 156 166 171 175 176 185 186
-
电信号段: 133 149 153 173 174 177 180 181 189 199
-
虚拟运营商: 170
匹配13*
的手机号:
/^(1)3(\d){9}$/.test(13131121111)复制代码
匹配14*
的手机号:
/^(1)4[5-9](\d){8}$/.test(14531121989)复制代码
匹配15*
的手机号:
/^(1)5[^4]{9}$/.test(15531121989)复制代码
匹配16*
的手机号:
/^(1)66(\d){8}$/.test(16631121989)复制代码
匹配17*
的手机号:
/^(1)7[0-8](\d){8}$/.test(17199121989)复制代码
匹配18*
的手机号:
/^(1)8(\d){9}$/.test(18131121989)复制代码
匹配19*
的手机号:
/^(1)9[8-9](\d){8}$/.test(19831121989)复制代码
匹配所有手机号:
/^((1)3(\d){9}$)|(^(1)4[5-9](\d){8}$)|(^(1)5[^4]{9}$)|(^(1)66(\d){8}$)|(^(1)7[0-8](\d){8}$)|(^(1)8(\d){9}$)|(^(1)9[8-9](\d){8}$)/.test(16961121989)复制代码
(2)邮箱
-
126规则:6~18个字符,可使用字母、数字、下划线,需以字母开头
-
163规则:6~18个字符,可使用字母、数字、下划线,需以字母开头 允许手机号
-
qq邮箱:数字5-10个数字
-
新浪邮箱规则:4-16个字符,可使用英文小写,数字,下划线,下划线不可在首位
-
搜狐邮箱规则:4-16位,英文、数字、下划线,小写字母开头
匹配126邮箱:
/((^([a-zA-Z]))(\w){5,17})@126.com$/.test("AA3333333333333333@126.com")复制代码
匹配163邮箱:
/((^([a-zA-Z]))(\w){5,17}$)|(^(1)(3(\d){9}$)|(4[5-9](\d){8}$)|(5[^4]{9})|(66(\d){8})|(7[0-8](\d){8})|(8(\d){9}$)|(9[8-9](\d){8}$))@163.com$/.test("15132221989@163.com")复制代码
匹配qq邮箱:
/(^[1-9]){5,10}@qq.com$/.test("115511@qq.com")复制代码
匹配新浪邮箱:
/^[a-z0-9]([a-z0-9_]{3,15})@sina.(com)|(cn)$/.test('223dddddddaddw22@sina.com')复制代码
匹配搜孤邮箱:
/(^[a-z])(\w){3,15}@sohu.com$/.test("dddddddfw@sohu.com")复制代码
(2)中文
/^[\u4e00-\u9fa5]$/g.test("我") 复制代码
(3)国内邮政编码
/^[0-9]{6}$/.test(100000)复制代码
。。。。。未完待续
作者:晴天de雨滴 出处:https://juejin.im/post/5b0cf331f265da0905017b48 版权所有,欢迎保留原文链接进行转载:希望看到我的最新文章的可以添加下关注哦!) 复制代码