在日常代码开发中,大家或多或少都会遇到一些正则表达式,但有的朋友只是会用,或者说大概了解而已。希望这篇深入浅出地讲解正则表达式的文章能够让大家受益。基本语法[xyz]匹配任何包含字符的字符集[^xyz]匹配任何包含字符的否定字符集\w(小写)匹配字母或数字或下划线字符\W(大写)不匹配任何字母、数字和下划线字符\s(小写)匹配任何空格\S(大写)匹配非空格的字符\d(小写)匹配数字\D(大写)匹配非数字字符\b(小写)匹配开头或单词结尾\B(大写)匹配不是单词开头或结尾的位置$匹配字符串结尾^匹配字符串开头。匹配除换行符以外的所有内容-重复0次或多次-重复1次或多次?重复0次或一次{n}重复n次{n,}重复n次或更多次{n,m}重复n次到m次等more.......更多语法可以查看匹配位置在W3C正则表达式中。需要强调几个匹配位置的语法,后面会一一说明。^匹配字符串的开头$匹配字符串的结尾(?=pattern)Positivelookahead,character字符串匹配条件的位置(?!pattern)Negativelookahead,字符串匹配条件的位置有两种编写正则表达式的常用方法和属性varreg=newRegExp('/1/')varreg=/1/reg是一个正则对象的实例。通过console.dir打印对象,我们可以看到实例上的属性和方法。常用方法举个简单的例子,了解一下test()和exec()的区别和使用场景。varreg=/1/,reg1=/(1)/reg.test(1111)//truereg.test(222)//falsereg.exec(11112)//["1",index:0,input:"11112"]reg1.exec(11112)//['1111','1',index:0,input:'11112']reg1.exec(222)//nulltest验证后会返回一个布尔值,主要用于验证是否匹配,验证成功后exec返回一个类似数组的对象,主要用于抓组,失败则返回null。reg1是匹配(1)分组的regex,使用exec匹配成功后返回['1111','1',index:0,input:'11112'],input为输入值,第一项为匹配条件第二项为匹配组。如果没有组,则第二项不存在。index属性指示匹配的项目数。下面将给出分组的详细示例。常用属性ignoreCase忽略大小写,默认为falseglobal全局匹配,默认为falsemultiline有换行时,可以获取换行的起始位置和结束位置,默认为false匹配规则正则表达式(regularexpression)描述了字符串匹配的一种模式,可以用来检查字符串是否包含某个子串,替换匹配到的子串,或者从某个字符串中提取出满足某个条件的子串等。可能有点难阅读说明和文档太官方了,假设我们已经了解了正则匹配的基本语法和一般用法,然后这里通过简单的例子一步步分析如何实现我们需要的正则表达式。例子:手机号码我举个例子来匹配一个手机号码。我们先来分析一下手机号的规则。以1开头,必须是数字,总长度为11位。那么我们有如下表达式:varreg=/^1[0-9]{10}$///根据正则语法^是匹配的开始,^1表示第一位必须以1开头,[0-9]表示数字必须为0-9,{10}表示重复次数为10,$终止符。简单的匹配规则就做好了。好像有点粗糙。一般手机号码的第二位没有0-9那么多的可能,所以我们需要对其进行优化。第一位为1,第二位为[3,5,8,7]:varreg=/^1[3,5,8,7]{1}[0-9]{9}$///根据正则语法^是匹配的开始,^1表示首位必须以1开头,[3,5,8,7]表示匹配任意一个数,{1}表示第几位repetitions为1,匹配前两位,加上后面的[0-9],{9}重复九次,$终止符。简单的匹配规则就做好了。这样一个基本的手机号码正则匹配规则就出来了。如果您的业务需要,您可以进行相应的更改。示例:相对于邮箱和手机号的规则,邮箱的匹配规则要复杂一些。同样,我们先分析邮箱的规则,比如QQ邮箱,110@qq.com,先有字符,长度大于1,然后是@,后面是一串长度大于1的字符,那么我们可以得到这样一个表达式公式:varreg=/^[\w\.]+@[\w.]+$///[\w\.]\w匹配字母或者数字或者下划线字符,\.匹配转义字符.,+表示重复一次或多次,匹配@符号,然后是相同的\w\。匹配一次或多次。例子:网站也分析网站规则,http(s)://segmentfault.com/1233,首先可能是http协议或者https协议,然后是://,然后是字符串。这样分析之后,再整理出对应的正则语法,很快就会有一个匹配规则出来:varreg=/^https?:\/\/.+$///会先http开头,^http,然后是?表示匹配0次或者一次,:,//需要用\转义,后跟各种不确定因素。+,当然如果我们想做更精确的匹配,可以自己修改规则。下面通过几个基本的例子,来回顾和巩固一下正则表达式的基本用法和匹配规则。首先分析要匹配的规则是什么,然后像搭积木一样一步步把规则拼起来。就是这样。自己定义更多。将不同的规则一一实现后,你会发现,如果只是做基础使用,远没有想象的那么难。分组就是把要匹配的规则分成一组写在()中,比如匹配数字(0-9),匹配字母(0-z),主要分为捕获分组和非捕获分组。抓包式分组首先说一下抓包式分组。主要可以做两件事情,引用和反向引用,我们在一些稍微复杂的正则表达式中经常会用到。捕获组引用在每个组被捕获后,可以在RegExp对象上获取最近捕获的组。以下是一些示例:varreg=/(1)(3)///两组reg.exec(123134)//捕获两组console.log(RegExp.$1)//1console.log(RegExp.$2)//3得到了最近捕获的组,但是很多时候我们不明白捕获组有什么用,如下以把html标签全部换成p标签为例,来说明如何引用捕获组。首先我们来分析一下匹配规则。开始标签是
