手机版

JavaScript系列文章:详细讲解正则表达式的基础知识

时间:2021-09-11 来源:互联网 编辑:宝哥软件园 浏览:

正则表达式是一种精致的工具,常用于查找和替换字符串。JavaScript语言参考了Perl,还提供了与正则表达式相关的模块,在开发中非常实用。在一些类库或框架中,比如jQuery,有很多正则表达式,所以学好正则表达式是提高开发技能的基本要求。所以今天博主们就详细总结一下正则表达式的相关知识,希望不熟悉的同学也能掌握正则表达式的原理和应用。

在JS中,有两种方法可以创建正则表达式,一种是字面量,另一种是构造函数,如下所示:

var regex=/\ w/;//或var regex=new RegExp(' \ \ w ');您可能会注意到,使用文字量比使用构造函数简单得多。\w代表与单个字母、数字或下划线匹配的单词。当使用RegExp构造函数时,我们的正则性变成了“\\w”,因为要在字符串中表示反斜杠,我们需要对其进行转义,即添加一个转义字符\。相信大家都知道,要表达一个正则性匹配反斜杠\在字面上的正则性,只需要写成\ \,但是要在字符串中表达这种正则性就像“\ \ \”,因为字符串中的前两个代表反斜杠\,后两个也代表反斜杠\,最后在正则级别,结果还是\ \。

对于以上两种创建形式,可以添加一些后缀修饰符,可以单独使用,也可以组合使用:

复制代码如下:/\ w/g;//全局搜索/\ w/I;//忽略大小写/\ w/m;//多行/\ w/u;//unicode/\ w/y;//sticky/\ w/gi;新的RegExp('\\w ',' gi ');

从英文注释来看,相信大家大概都知道一二。需要注意的是U和Y修饰符,这是ES6的新特性。u表示启用Unicode模式,这对于匹配中文特别有用,而Y是粘性的,表示“粘连”,类似于G,属于全局匹配,但它们也有区别,我们后面会介绍。

规则相关法

既然有了正则表达式对象,怎么用呢?JS中的正则和字符串都在原型中提供了相应的方法。让我们首先看看常规原型中的两种方法:

regexp . prototype . test(str);regexp . prototype . exec(str);上面的test()和exec()方法都需要传入一个字符串来搜索和匹配这个字符串。不同的是,test()方法将返回true或false,指示字符串和正则表达式是否匹配,而exec()方法将在匹配时返回匹配的结果数组,如果不匹配,则只返回null值。让我们来看看两者的区别:

//RegExp # test()var regex=/hello/;var result=regex . test(' hello world ');//true//RegExp # exec()/var regex=/hello/;var result=regex . exec(' hello world ');//['hello']对于exec()方法,如果正则表达式包含一个捕获组,它将在匹配后出现在结果数组中:

//(llo)是捕获组var regex=/he(llo)/;var result=regex . exec(' hello world ');//['hello ',' llo']在开发过程中,test()方法一般用于用户输入验证,如邮箱验证和手机号码验证,exec()方法一般用于从特定内容中获取有价值的信息,如从用户的邮箱输入中获取ID和邮箱类型,从手机号码中获取该号码的归属。

字符串相关法

以上是常规原型中的两种方法。现在让我们看看字符串原型中有哪些方法可用:

string . prototype . search(regexp);string . prototype . match(regexp);string . prototype . split([分隔符[,限制]]);string . prototype . replace(regexp | substr,newSubStr | function);我们来谈谈String#search()方法,它将根据常规参数搜索字符串。如果匹配成功,将返回第一个匹配的索引,如果匹配失败,将返回-1。

//String # search()‘hello world’。搜索(/hello/);//0'hello world '。search(/hi/);//-1 String # match()方法类似于RegExp#exec()方法,它将返回结果数组。不同的是,如果string # match()的常规参数包含全局标记g,那么结果中只会出现匹配的子字符串,而捕获组将被忽略,这与RegExp#exec()有些不同。看看下面代码:

//String # match()‘hello hello’。火柴。//['hello ',' llo']//string # match()丢弃捕获组' hello hello '。遇到全局g修饰符时匹配(/he(llo)/g);//['hello ',' hello']//regexp # exec()仍然包含捕获组/he(llo)/g . exec(' hello hello ');//['hello ',' llo']因此,如果需要始终返回捕获组作为结果,则应该使用RegExp#exec()方法,而不是String#match()方法。

接下来,我们来谈谈String#split()方法,该方法用于拆分字符串,然后返回包含其子字符串的数组结果。分隔符和限制参数是可选的,分隔符可以指定为字符串或常规,限制指定返回结果数的最大限制。如果省略分隔符,此方法的数组结果只包含它自己的源字符串;如果sparator指定了一个空字符串,那么源字符串将被字符分割;如果分隔符是非空字符串或正则表达式,此方法将以此参数为单位划分源字符串。下面的代码演示了此方法的用法:

//String # split()“hello”。split();//['hello']'hello '。拆分(“”);//['h ',' e ',' l ',' l ',' o']'你好'。split(',3);//['h ',' e ',' l']//指定一个非空字符串var source=' hello worldvar result=source . split(');//['hello ',' world']//或者使用正则表达式var result=source . split(/\ s/);//['hello ',' world']如果separtor是正则表达式,并且正则表达式包含一个捕获组,则该捕获组也将出现在结果数组中://String#split()正则捕获组var source=' matchandsplitvar result=source.split('和');//['match ',' split ']var result=source . split(/和/);//['match ',' split']//正则包含捕获组var result=source . split(/(and)/);//['match ',' and ',' split']最后,我们来介绍一下String#replace()方法,它可以同时执行搜索和替换操作。

从上面的函数签名来看,该方法将接受两个参数:第一个参数可以是正则表达式或字符串,两者都表示要匹配的子字符串;第二个参数可以指定字符串或函数。如果指定一个字符串,这意味着该字符串将替换匹配的子字符串。如果指定一个函数,该函数的返回值将替换匹配的子字符串。

String#replace()方法最终将返回一个已被替换的新字符串。下面分别演示了替换方法的使用:

//String # replace()var source=' matchindsplistand replace ';var result=source.replace('and ','-');//'match-splitandreplace'/或var result=source。替换(/和/,function(){ return '-';});///“match-splitandreplace”从上面的代码中可以看出,“and”已经被替换为“-”,但是我们也注意到,只有第一个“and”被替换,而后者没有被处理。这里,我们需要理解String#replace()方法只替换第一个匹配的字符串。如果我们需要全局替换,我们需要将第一个参数指定为正则表达式,并追加全局G修饰符,如下所示:

//String#replace()全局替换varsource=' matchindsplistand place ';var result=source . replace(/and/g,'-');//' match-split-replace ' var result=source . replace(/and/g,function(){ return '-';});//'match-split-replace '初学者看到上面的代码可能会感到困惑。直接为第二个参数指定字符串非常简单。为什么我们要使用一个函数然后返回值?让我们看看下面的例子来了解一下:

//String#replace()替换函数varsource=' matchindsplistand place '的参数列表;var result=source . replace(/(a(nd))/g,function(match,p1,p2,offset,string){ console . group(' match : ');console.log(match,p1,p2,offset,string);console . GroupEnd();返回'-';});//'match-split-replace '在上面的代码中,第一个参数是正则表达式,它包含两个捕获组(and)和(nd),第二个参数指定了一个匿名函数,它的函数列表中有一些参数:match、p1、p2、offset、string,对应匹配的子串,第一个捕获组、第二个捕获组,匹配的子串在源字符串中的索引,以及源字符串,我们可以把这个匿名函数称为“replace”或者“replacerment function”。在替换函数的参数列表中,匹配、偏移和字符串总是存在于每个匹配中,而中间的捕获组,如p1和p2,将基于String#replace()方法

以下是代码运行后的控制台打印结果:

现在,指定一个函数比指定一个字符串要强大得多。每次匹配,我们都能得到这些有用的信息。我们可以对其进行一些操作,最后返回值作为新的子串进行替换。因此,建议在调用String#replace()方法时使用上述方法。

以上是与String类正则化相关的常用方法。需要注意的是,String#search()和String#match()方法的签名中的参数都是正则对象,如果我们传递其他类型的参数,它们将被隐式转换为正则对象。具体步骤是调用参数值的toString()方法获取字符串类型值,然后调用new RegExp(val)获取常规对象:

///-String # search(new RegExp(val . tostring()))' 123 123 '。搜索(1);//0“true false”。搜索(真);//0'123 123'.搜索(' \ \ s ');//3 var o={ tostring : function(){ return ' \ \ s ';}};'123 123'.搜索(o);//3///-String # match(new RegExp(val . tostring()))' 123 123 '。匹配(1);//[' 1 ']“true false”。匹配(真);//['true']'123 123 '。匹配(' \ \ s ');//[' ']var o={ tostring : function(){ return ' 1(23)';}};'123 123'.匹配(o);//'123 ',' 23'],但是split()和replace()方法不会将字符串转换为正则表达式对象。对于其他类型的值,它们只会调用自己的toString()方法将参数值转换为字符串,而不会进一步将其转换为常规值。你可以自己测试。

以上就是正则化的基本知识和常用方法。由于篇幅原因,博主们会在下一篇文章中安排更多关于正则表达式的介绍和解释,敬请期待。

版权声明:JavaScript系列文章:详细讲解正则表达式的基础知识是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。