1  正则表达式

    使用单个字符串来描述、匹配一系列符号某个句法规则的字符串,可以简单理解为按照某种规则去匹配符合条件的字符串。

     Ps:https://regexper.com/  可帮助理解正则表达式,正则表达式工具

 

 

2  regexp对象         

    JavaScript通过内置对象RegExp支持正则表达式,有两种方法实例化RegExp对象:字面量、构造函数

 

 

3  预定义类

  .         等价于 [^\r\n]          即除了回车符和换行符之外的所有字符

  \d        等价于[0-9]            即数字字符

  \D        等价于[^0-9]           即非数字字符

  \s        等价于[\t\n\x0B\f\r]     即空白符

  \S        等价于[^\t\n\x0B\f\r]    即非空白符

  \w       等价于[A-Za-z_0-9]       即单词字符

  \W       等价于[^a-Za-z_0-9]      即非单词字符

 

 

4  边界字符

  ^  即以xxx开始

  $  即以xxx结束

  \b 即单词边界

  \B 即非单词边界

 

 

5  量词

  ?  即出现0次或1次,最多1次

  +  即出现1次或多次,最少1次

 *  即出现0次或多次,任意次

{n} 即出现n次

{n,m} 即出现n到m次

{n,}   即至少出现n次

 

 

6  贪婪模式

   \d{3,6}   //尽可能多的匹配

 

 

7  非贪婪模式

   让正则表达式尽可能少的匹配,即一旦匹配成功匹配不再继续尝试。在量词后面加上?即可。

  ‘123456789’.match(/\d{3,5}?/g)

 

 

8  分组

   使用()可以达到分组的功能,使量词作用于分组

   (Byron){3}

 

 

9  或

   使用|可以达到或的效果

   Byron|Casper          Byr(on|Ca)sper

 

 

10 反向引用

   2015-12-25  =》 12/25/2015

   ‘2015-12-25’.replace(/(\d{4})-(\d{2})-(\d{2})/g,’$2$3$1’)

 

 

11  忽略分组

     不希望捕获某些分组,只需要在分组内加上?:即可

   (?:Byron).(ok)

 

 

12  前瞻

      正则表达式从文本头部向尾部开始解析,文本尾部方向,称为“前”。前瞻就是在正则表达式匹配到规则的时候,向前检查是否符合断言。

      符合和不符合特定断言称为肯定/正向匹配和否定/负向匹配。

 

     正向前瞻:exp(?=asser)

     负向前瞻:exp(!=asser)



console.log('a2*3'.replace(/\w(?=\d)/g,'x')); //x2*3 
console.log('a2*34v8'.replace(/\w(?=\d)/g,'x'));//x2*x4x8 
console.log('a2*34vv'.replace(/\w(?=\d)/g,'x'));//x2*x4vv 
console.log('a2*34vv'.replace(/\w(?!\d)/g,'x'));//ax*3xxx



 

 

13  对象属性

      global:是否全局搜索,默认false;

      ignore:是否大小写敏感,默认false;

      multiline:多行搜索,默认值false;

      lastIndex:是当前表达式匹配内容的最后一个字符的下一个位置

      source:正则表达式的文本字符串;

 

 

14  正则对象方法

   (1)     RegExp.prototype.exec(str):使用正则表达式对字符串执行搜索,并将更新全局RegExp对象的书写以匹配结果。如果没有匹配的文本则返回null,否则返回一个结果数组。Index声明匹配文本的第一个字符的位置;input存放检索的字符串string。

       非全局调用:调用非全局的RegExp对象的exec()时,返回数组;第一个元素是与正则表达式相匹配的文本,第二个元素是与RegExpObject的第一个子表达式相匹配的文本(如果有的话),第三个元素是与RegExp对象的第二个子表达式相匹配的文本(如果有的话),以此类推。



var reg3=/\d(\w)\d/; 
var reg4=/\d(\w)\d/g; 
var ts='1a2b3c4d5e'; 
var ret=reg3.exec(ts); 
console.log(reg3.lastIndex + '\t' + ret.index + '\t' + ret.toString());//0 0  1a2,a 
console.log(reg3.lastIndex + '\t' + ret.index + '\t' + ret.toString());//0 0  1a2,a 
while(ret = reg4.exec(ts)){ 
    console.log(reg4.lastIndex + '\t' + ret.index + '\t' + ret.toString());//3 0  1a2,a   //7    4  3c4,c 
}



 

 (2)RegExp.prototype.test(str):用于测试字符串参数中是否存在匹配正则表达式模式的字符串。如果存在则返回true,否则返回false。

 

 

14  string与正则相关方法

(1)String.prototype.search(reg):用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串;方法返回第一个匹配结果index,查找不到返回-1;search()方法不执行全局匹配,它将忽略g标志,且总是从字符串的开始进行检索。



console.log("javascript".search(/script/i));//4



 

(2)String.prototype.match(reg):match()方法将检索字符串,以找到一个或多个与regexp匹配的文本;regexp是否具有标志g对结果影响很大。

如果regexp没有g标志,则match()方法就只能在字符串中执行一次匹配;如果没有找到任何匹配的文本,将返回null,否则返回一个数组,其中存放了与它找到的匹配文本有关的信息。返回数组的第一个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本;除了常规的数组元素外,返回的数组还包括2个对象属性,index声明匹配文本的起始字符在字符串的位置,input声明对stringObject的引用。

如果regexp具有全局标志g,则match()方法将执行全局检索,找到字符串中的所有匹配子字符串;没有找到任何匹配的子串则返回null,如果找到了一个或多个匹配子串,则返回一个数组。数组元素中存放是字符串中所有的匹配子串,且没有index或input属性。



var reg3=/\d(\w)\d/; 
var reg4=/\d(\w)\d/g; 
var ts='$1a2b3c4d5e'; 
var ret=ts.match(reg3); 
console.log(ret);//[ '1a2', 'a', index: 1, input: '$1a2b3c4d5e' ] 
console.log(ret.index + '\t' +reg3.lastIndex);//1  0 
 
ret = ts.match(reg4); 
console.log(ret);//[ '1a2', '3c4' ] 
console.log(ret.index + '\t' + reg4.lastIndex);//undefined 0



 

(3)String.prototype.split(reg):经常使用split()方法将字符串分割为字符数组,



console.log('a,b,c,d'.split(','));  //[“a”,”b”,”c”,”d”] 
console.log('a1b2c3d'.split(/\d/)); //[“a”,”b”,”c”,”d”]



 

(4)String.prototype.replace():



String.prototype.replace(str,replaceStr);

String.prototype.replace(reg,replaceStr)

String.prototype.replace(reg,function)



 

 

其中,function参数含义,function会在每次匹配替换的时候调用,有四个参数:匹配字符串、正则表达式分组内容,没有分组则没有该参数、匹配项在字符串中的index、原字符串。