Regular Expression

什么是 RegExp?

RegExp 是正则表达式的缩写。javascript

 正则表达式( regular expression)描述了一种字符串匹配的模式。能够用来:java

(1)检查一个串中是否含有符合某个规则的子串,而且能够获得这个子串;正则表达式

(2)根据匹配规则对字符串进行灵活的替换操做express

正则表达式在线测试网站,https://regexper.com/ 数组

经过该网站,能够经过图形化的界面去领会正则表达式的含义,将更加直观和容易理解函数

 

RegExp对象:测试

  JavaScript经过内置对象RegExp来支持正则表达式网站

  有两种方法实例化RegExp对象:spa

  一、字面量  :如 var reg = /\bis\b/g;prototype

    二、构造函数 : 如 var reg = new RegExp('\\bis\\b','g'); 

    修饰符: g:global全文搜索,不添加,搜索到第一个匹配就中止

         i:ignore case忽略大小写,默认大小写敏感 

          m:multiple lines 多行搜索 

  

正则表达式主要有一下两种字符组成:

一、原义文本字符(普通字符):

  字母、数字、汉字、下划线、以及没有特殊定义的标点符号,都是"普通字符"表达式中的普通字符。在匹配一个字符串的时候,匹配与之相同一个字符 如:a,b,

二、元字符:

  指的是在正则表达式中具备特殊含义的非字母字符(转义字符) ,如\n换行符  \t水平制表符  \v垂直制表符 \r回车符 \o空字符 \f换页符 \cX与X对应的控制字符(ctrl+x)

  特殊元字符:. * + $ ^| \(){}[]

字符类:

  使用元字符[]来构建的一个简单类,所谓类是指符合某些特性的对象,一个泛指,而不是特质某一个字符,如:[abc]把字符a、b、c归为一类,表达式能够匹配这些字符

[abc] 

 

范围类:

  可使用[a-z]来链接两个字符,表示从a到z的任意字符,这是个闭区间,包含了a和z字符

 

  在[]组成的类内部是能够连写的,好比[a-zA-Z]

 

预约义类和边界

  匹配一个ab+数字+任意字符 的字符串 如:ab[0-9][^\r\n]

  

 

   正则表达式提供了几个经常使用的边界表达式,如图

  

  

  

  

  注意:^放在[]里面,就表示除xxx字符以外,放在外面则表示以xxx开始

 

量词:

  若是但愿一个连续出现20次的数字字符串,能够采起这种形式 \d{20}

  \d{20}\w\d?\w+\d*\d{3}\w{3,5}\d{3,}

  

    

 

贪婪模式和非贪婪模式:

  贪婪模式:\d{3,6} ,尽量多的匹配

  非贪婪模式:让正则表达式尽量少的匹配,也就是说一旦成功匹配了就再也不尝试,在后面加个?号便可

分组:

  配置字符串Byron连续出现3次的场景,

  Byron{3}   实际效果:

  () 圆括号: 能够达到分组的功能,使量词做用于分组

   |或:使用|能够达到或的效果 Byron | Casper 

  也能够这样结合分组使用 Byr(on|Ca)sper     

  选择出来的是符合Byronsper或者ByronCasper

  反向引用

   将2015-12-25 =>12/25/2015

前瞻:

  正则表达式从文本头部向尾部开始解析,文本尾部方向,称为‘前’

  前瞻就是在正则表达式匹配到规则的时候,向前检查是否符合断言,后顾/后瞻方向相反

  javascript不支持后顾

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

    \w(?=\d)

    \w(?!\d)

 

   分析:从第一个字符'a'开始,知足\w,后跟'2',符合断言'\d’,所以a被X所替换

    分析同上

 

对象属性:

    global全文搜索,不添加,搜索到第一个匹配就中止 默认值false

    ignore case忽略大小写,默认大小写敏感 默认值false

      multiple lines 多行搜索 ,默认值false

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

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

    这几个属性都是只读的,不能手动设置 

RegExp的test和exec方法:

  RegExp.prototype.test(str) :

  用于测试字符串参数中是否存在匹配正则表达式模式的字符串

  若是存在,返回true,不然返回false

  

 

给其加上g后,判断ab是存在匹配该模式的字符,  ,从结果看来,当执行到第三次,结果变成了false,实际上是lastIndex这个属性在做用,缘由在于正则表达式执行了test方法后都会做用到正则表达式自己的结果。,能够看到执行两次后,lastIndex的值变为了2

分析:当前匹配结果,就是a,当前匹配结果的最后一个结果,仍是a,当前匹配结果的最后一个结果的下一个结果,那就是b,此时lastIndex的值就是1了。那么在执行一次,lastIndex的结果就是2,看来test方法执行,其lastIndex并非每次都是从头开始的,那么第3次执行的时候,lastIndex就被重置为0了。

若是测试的是reg1.test('a');那么其返回的结果,只有奇数次是true。由于咱们用test的方法时候,只是为了测试是否存在某个字符而已,所以就没有必要加上g标志了。

 

  RegExp.prototype.exec(str)

  使用正则表达式模式对字符串执行搜索,并更新全局RegExp对象的属性以反应匹配结果

  若是没有匹配的文本则返回null,不然返回一个结果数组 

    -index  声明匹配文本的第一个字符的位置

    -input 存放被检索的字符串String

  非全局调用:

   *调用非全局的RegExp对象的exec()时,返回数组

   *第一个元素是与正则表达式相匹配的文本

   *第二个元素是与RegExpObject的第一个子表达式相匹配的文本(若是有的话)

       *第三个元素是与RegExp对象的第二个子表达式相匹配的文本(若是有的话,依次类推)

  注意了:在非全局的状况下,lastIndex根本就不生效

 

 以上是非全局和全局调用的结果

 

字符串对象方法:

  String.prototype.search(reg)

  *search()方法用于检索字符串中指定子字符串,或检索与正则表达式相匹配的子字符串

  *方法返回第一个匹配结果 index,查找不到返回-1

  *search()方法不执行全局匹配,它将忽略标志g,而且老是从字符串的开始进行检索

  ‘a1b2c3’.search('1');返回1,会将其转换成正则表达式 ‘a1b2c3’.search(/1/);返回1,若是传入的参数不是正则,则会尝试转换成正则表达式

 

  String.prototype.match(reg)

  非全局调用:

  若是regexp没有标志g,那么match()方法就只能在字符串中执行一次匹配

  若是没有找到任何文本,将返回null

  不然它将返回一个数组,其中存放了与它找到的匹配文本有关的信息

  返回数据的第一个元素存放的是匹配文本,而其他的元素存放的是与正则表达式的子表达式(如分组)匹配的文本

  除了常规的数组元素以外,返回的数组还含有2个对象属性

  -index 声明匹配文本的起始字符在字符串中的位置

  -input声明对stringObject的引用

  全局调用:

  若是regexp具备标志g,则match方法将执行全局搜索,找到字符串中全部匹配子字符串

  *没有找到任何匹配的子串,则返回null

  *若是找到了一个或多个匹配子串,则返回一个数组

  数组元素中存放的是字符串中全部匹配子串,并且也没有index属性或input属性

  以上是非全局和全局调用结果,非全局下,lastIndex不起做用,其ret中的a是分组的字符。在全局条件下ret的结果为1a2,3c4

 

  Sting.propotype.split(reg)

  咱们常用split方法把字符串分割为字符数组

  'a1b2c3d4e5',split(/\d/); 

  String.prototype.replace()

  'a1b1c1'.replace('1',2)  -->‘a2b1c1’,并非指望

  ‘a1b1c1’.replace(/1/g,2)-->'a2b2c2'

  三种参数:

    replace(str,replaceStr);

      replace(reg,replaceStr);

    replace(reg,function); //处理更加复杂的替换结果

    采用第三种,用function的返回值做为替换结果,function会在每次匹配替换结果的时候执行四个参数

    一、匹配字符串

    二、正则表达式分组内容,没有分组则没有参数

    三、匹配项在字符串中的index下标

    四、原字符串

    将'a1b2c3d4e5' ---> 'a2b3c4d5e6'  

    

从上看到,两次匹配的结果分别是 1b2 和 2d4,因为分组后,只对group1和group3保留,去掉group2,所以1b2-->12   3d4-->34,最终替换的结果就是a12c34e5

相关文章
相关标签/搜索