正则表达式学习笔记及常用正则汇总

最简单的正则表达式

正则在自然语言处理中广泛运用到,对前端开发者来说,最常见的正则是表单上的一些验证。

现在介绍一种最简单的正则(匹配指定的文本):
下面是一段文字,我们现在想把里面的某个字,比如(),匹配出来。

var b ='岁月无情,豁然回首才发现人活着是一种心情,曾经拥有的不要忘记,已经得到的更加珍惜,属于自己的不要放弃,已经失去的不要回忆,想要得到的一定要努力。'

b.match(/的/g)

这里我们使用到了match方法来做匹配,来分析一下这个写法,b表示字符串,g表示全局匹配,如果去掉g,只能匹配出来第一个()。
是不是最简单的正则?你需要匹配什么内容,就直接在//之间写这个字符,然后正则系统会自动从字符串去查找。

常用正则方法三剑客了解一下?

在上面的例子中,使用到了match(),可以匹配出来字符,并且返回值是一个数组。还有一个常用的方法是test()test的返回值是bool类型,通常用来写在if语句中判断一个字符串是否满足正则表达式,在表单验证中经常用到。还有一个常用的方法是replace(),replace和match比较像,都能匹配出字符,但是replace还有第二个参数可以做字符替换。
下面我们来讲解这三个方法的具体使用场景:

test()

正则有各种各样的符号,一般很难背下来,但是常用的符号多练习几遍,印象就会深刻。

我们用实际的例子来分析test()以及正则的实现,以注册表单为例:
test()和match()写法刚好反过来,test是正则写在前面,字符串写到函数的参数中。

场景1:账号只能是数字

看到这样一道题目,你首先要思考2个字——“规则”,账号是主体,账号的规则是只能是数字,那么就是说输入非数字就不能匹配。

了解了规则之后,就很简单了,正则提供了默认匹配数字的字符,d或者是[0-9],那么是不是直接/d/.test('123')就行了呢?当然不是,d表示是数字,你还需要加上一个特殊字符,表示匹配所有的数字,因为一个字符串有N个数字,全部都要匹配成功。

这里我使用的是+,加号表示至少匹配一次数字,比如123,如果使用d,就只能一个个匹配出来[1,2,3],这需要在match方法中使用,在test方法中,必须匹配整个字符串是否符合正则。改成d+之后,匹配的是整个字符串中的数字,是不是离我们的最终结果很接近了。

上面的操作似乎已经可以匹配出数字了,但是记住,test()方法中,如果你要验证整个字符串只能是数字,必须加上正则的开始符号^和结束符号$,表示的是从字符串'123'开头匹配到结尾都必须满足数字,如果中间插入其他字符'1kk2什么3',就匹配失败。所以最终的正则写法是 /^\d+$/,或者是/^d+$/g,这里的g可加可不加。

var user = '123' //可以把123改成任意字符来测试。
if (/^\d+$/g.test(user)) {} //写法1 if(true){}
if (/^[0-9]+$/g.test(user)) {} //写法2 if(true){}

场景2:账号只能是字母

数字匹配完了,换成字母会不会呢?只要把d或[0-9]改成字母的正则就行了。字母包含大小写,所以使用[a-zA-Z]。如果去掉^和$,那么仅仅是匹配user字符串中是否包含字母,使用indexOf()或者includes()代替。

var user = 'hyy' //可以把hyy改成任意字符来测试。
if (/^[a-zA-Z]+$/g.test(user)) {} //if(true){}

场景3:账号只能是字母开头,并且字母和数字的组合,长度范围是6-10。

单打了2轮,不够爽,来一套组合拳。上面学习了 ^ $ [0-9] [a-zA-Z] + 这几个正则符号的使用,一定要记下来,很常用的。这组合拳似乎有点复杂,不过不怕,遇到这种问题,我们第一步还是提取规则:
字母开头;
字母和数字组合;
长度6-10。

1、你脑子里要想着 /^what❓$/.test(user) 的结构。

2、字母开头,那么就是第一个字符必须是字母。你需要学习一个新的正则,大括号{n,m},x{1}表示匹配前面的字符1次,x{2}表示匹配2次符合x的字符,还可以写成x{1,3},表示匹配符合x正则的符合最少1次,最多3次。说这段话你一下子理解不了,就跳过。我们只看{1}这种情况。所以,现在加上字母开头这条规则之后,正则变成了 /^[a-zA-Z]{1}}/,注意,我暂时没有写结束符号,最后再加上。

3、字母和数字组合,我们是不是要写成[a-zA-Z]d呢?其实还有一个更好的办法,你又学到了一个新的正则w,w和([a-zA-Z]|d)相同,都表示字母和数字的组合。顺便再讲讲 () 和 | 这2个正则的含义。在正则中,()表示一个group,也就是组,|表示或,所以([a-zA-Z]|d)的含义就是字母或者数字,再使用()括起来,形成了一个正则组。觉得括号复杂的话,使用w就行了。

4、终于快搞定了,最后一条规则,长度6-10,如果你不想使用正则,那么长度也可以根据字符串的length来判断,这样的话,上面的正则可以加上结束符号$直接使用了。\w后面我悄悄加了个+,因为要匹配后面的所有字母和数字至少一次,然后再写$结束:

if(/^[a-zA-Z]{1}\w+$/g.test('Hyy123') && 'Hyy123'.length > 5 && 'Hyy123'.length < 11){}

但是既然学习正则,那就用正则的方式去解决,其实更加简单。
利用上面学习的大括号{},我们可以很容易实现长度控制。直接给你看最终形态:

if(/^[a-zA-Z]{1}\w{5,9}$/g.test('Hyy123')){} //true

这个最终形态的正则可以拆分成几部分来看:

^:开头
[a-zA-Z]{1}:第一个字符匹配一次,且只能是字母
\w{5,9}:后面的字符是字母或者数字的组合,且长度是6-10,因为第一个字符占了一个长度,所以这里匹配的是5-9的长度
$:结束

场景4:密码只能是6位数字。

这个就简单多了。规则首先是数字,然后长度是6。最后的g可要可不要。

/^\d{6}$/

match()

test()通常用来验证字符串是否符合某个规则,而match()是从字符串里面提取符合某规则的字符。

replace()

在前端开发中,这个方法很常用,看这么几个场景:

场景1:将字符串里面的逗号替换成感叹号

var s = '我是一个前端,上班1年了,现在失业,想进入腾讯工作,这是我的联系方式:15527578846'
s.replace(/,/g, "!")
// "我是一个前端!上班1年了!现在失业!想进入腾讯工作!这是我的联系方式:15527578846"

场景2:将手机号最后8位替换成 *

1、首先你要使用test判断是否是手机号,然后再执行替换语句。

2、使用match提取出手机号的后8位数字。

'15527578846'.match(/^\d{3}((\d){8})$/)
//["15527578846", "27578846", "7", index: 0, input: "15527578846"]

var r = '15527578846'.match(/^\d{3}((\d){8})$/)[1] //"27578846"

3、接着执行replace匹配变量r,然后执行替换。

'15527578846'.replace(r, '********') // "155********"

4、我们可以将这个过程封装成一个函数。

function regexTest(tel) {
    if(typeof tel !== 'string') throw Error('类型不对!');
    tel.match(/^\d{3}((\d){8})$/);
    var r = tel.match(/^\d{3}((\d){8})$/)[1];
    return tel.replace(r, '********');
}
regexTest('15527578846') // "155********"

工作常用正则汇总

 匹配URL

const regexURL = /((https?|ftp)?:\/\/)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/gi;
// 这条正则可以匹配这么一坨格式的url
//www.baidu.com
//http://www.baidu.com
//https://www.baidu.com
//baidu.com
//test.baidu.com  
//gds.baidu.com
//ftp://www.baidu.com
// ---- 分割线 ---- 
// 也许有小伙伴不需要匹配这么一大坨,只要匹配http和https,上面的改写一下就好了
const regexURL = /(https?:\/\/)(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/gi;
//http://www.baidu.com
//https://www.baidu.com

匹配中国身份证

const regexCHINAIDCARD = /^((1[1-5])|(2[1-3])|(3[1-7])|(4[1-6])|(5[0-4])|(6[1-5])|71|(8[12])|91)\d{4}((19\d{2}(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(19\d{2}(0[13578]|1[02])31)|(19\d{2}02(0[1-9]|1\d|2[0-8]))|(19([13579][26]|[2468][048]|0[48])0229))\d{3}(\d|X|x)?$/gi;

匹配数字,整数,浮点

// 这货只会匹配正整数
const regexInteger = /^\d+$/gi;
// 肯定有人想问,范围性的整数呢,看我改下,比如0-100
const regexRangeInteger = /^\d$|^[1-9]\d$|^100$/gi;
// 匹配小数呢,不限定范围的
const regexFloat = /^\d+\.\d+$/gi
// 倘若要限定呢,比如还是那个,0~100的任意整数和浮点数
const regexRangeIntFloat = /^(\d{0,2}(\.\d+)?|100(\.0+)?)$/gi;

匹配手机号码

// 不含卫星电话这些,只是罗列的常见的手机范围,也考虑了区域和长途前缀
const regexMobileNumber = /^(0|86|17951)?(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$/gi;

匹配邮箱

const regexEmail = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9_]+\.)+[a-zA-Z]{2,}))$/gi

加强版密码设置规范

// 必须含有大小写字母,数字及特殊符号,长度8~24
const regexEnhancePassword = /^(?!\s)((?=.*[a-zA-Z])(?=.*[a-z])(?=.*[A-Z])(?=.*[\W_]).\S{8,24})$/g;

中国车牌号校验

const regexCarLicense = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/g;

匹配QQ号,微信号

// QQ在我印象中好像一直都是纯数字,现在好像发展到11位了,好像最初是从100000开始的
const regexQQNumber = /^[1-9]\d{5,10}$/gi;
// 特意去查了下最新的微信号的规则
//1、微信号是微信的唯一凭证,只能设置1次;
//2、可使用6-20个字母、数字、下划线和减号;
//3、必须以字母开头(字母不区分大小写);
//4、不支持设置中文。
const regexWeChatNumber = /^[A-Za-z][\w-]{5,19}$/gi;

用户名规范

// 普通版,英文+数字,必须字母开头,允许下划线,长度八到十六
const regexNormalUsername = /^[a-zA-Z]\w{7,15}$/gi;
// 在这个基础上允许中文四到六个字符
const regexE1 = /^[\u4e00-\u9fa5]{4,6}$|^[a-zA-Z]\w{7,15}$/gi;

猜你喜欢

转载自www.cnblogs.com/AdamCenWeb/p/10718823.html
今日推荐