超全的正则表达式讲解
正则表达式用途
正则表达式(regular expression,在代码中常简写为reg)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。搜索模式可用于文本搜索和文本替换。
当您检索某个文本时,可以使用一种模式来描述要检索的内容。正则表达式是进行字符串匹配检测的,当我们为了匹配特殊字符或有特殊匹配原则的字符的时候,正则表达式是最佳的选择。
正则表达式通常用于两种任务:1.验证,2.搜索/替换。用于验证时,通常需要在前后分别加上^和KaTeX parse error: Undefined control sequence: \b at position 51: …定,此外,也有可能要在前后加上\̲b̲而不是^和$。
定义一个正则表达式的两种方法
方法一:字面量形式定义正则
用字面量形式定义正则时,正则表达式放在/ /之中来书写,语法如下:
var expression = /pattern/flags ;
/pattern/flags 是一个正则表达式,pattern是一个正则表达式主体(用于检索),flags(即modifiers)是一个修饰符(搜索不区分大小写),还有修饰符g(全局模式,将此正则应用于所有字符,而非在发现有、第一个匹配项时停止)、m(多行模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项)
方法二:通过RegExp构造函数定义正则
通过构造函数RegExp来定义正则,语法是:
var patt1 = new RegExp(参数一,可选的参数二);
两个参数都是字符串,参数一是正则主体,有时需要对其进行双重转义,参数二是可选的,为修饰符i/g/m。 i代表忽略大小写,m代表执行多次,g代表全局匹配,匹配满足条件所有的。
无论方法一还是用方法二定义正则,效果都是一样的,一般我们习惯用字面量形式定义正则。比如下面两种写法是等价的:
var reg = /xyz/i
var reg = RegExp(‘xyz’, ‘i’)
正则速记表
下面这个表很重要,每个元字符代表什么意思我们要清楚
比如说 [ a-z ]意思是查找a-z之间的任意字符,[0-9]意思是匹配任意0-9之间的数字。而\是转义字符,比如要匹配 **.**或者*或者\本身那正则应该写成\ . 或 * 或 \ 再比如var num = /^ \d{3} $ / 这里num值验证的是3位数字,^代表字符串开始,$代表字符串结束,\d代表数字,{3}代表重复3次。
正则表达式的验证
正则表达式实例的test方法
RegExp.prototype.test( ) 正则表达式的test方法返回一个布尔值true或false,表示当前模式是否能匹配参数字符串。
正则表达式实例的exec方法
RegExp.prototype.exec( ) 正则表达式的exec方法,如果匹配成功就返回一个数组,数组成员是匹配成功的子字符串,否则返回null。
字符串的实例方法match
String.prototype.match() 字符串实例对象的match方法对字符串进行正则匹配,返回匹配结果;
字符串的实例方法search
String.prototype.search() 字符串对象的search方法,返回第一个满足条件的匹配结果在整个字符串中的位置。如果没有任何匹配,则返回-1。
正则捕获
在讲正则捕获之前先看一个常见的需求:写一个验证手机号是否输入正确的案例。
思考:手机号都是11位数,并且第一位都是1,所以要写固定,第二位是可以是3,4,5,6,7,8中的任意一位,剩下的九位0~9都可以,所以\d要重复9次。所以可以写成/^ 1[3,4,5,6,7,8]\d{9} $/
刚才的例子是判断一个字符串是否符合要求,但正则不仅仅这么简单,还可以进行分组提取。
正则给我们提供了一个exec()方法,如果匹配成功,返回一个数组Array,匹配失败会返回null,我们可以利用此方法提取电话号的区号和本地号码,如:
上述的reg所包含的正则带有(),可以为其分组,(\d{3}|\d{4})为一组,(\d{0,})为一组。成功打印出来,返回数组格式,这样我们就可以轻松拿到想要的号段。
正则表达式中如果有分组,那么分组匹配的内容,就会被保存到RegExp.$1-RegExp.$99中,这种现象叫做正则表达式的捕获。可能会有些不清楚,解释一下:RegExp代表的就是正则,$1-$99代表的是捕获到的每个字段,存在1-99当中。那么RegExp.$1代表的就是第一个字段,RegExp.$2代表的是第二个字段。
举个例子,还拿刚才的电话号来说,它有分组,一个是区号,一个是本地号码,打印出来是一个数组,那么我们就可以RegExp.$1和RegExp.$2捕获到这两个分组的值。
常见正则表达式总结
下面我整理出了常用的正则,供大家开发中遇到同样需求时以作参考。