1.定义及概念

正则表达式(Regular Expression),又称规则表达式,是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。它是一种文本模式(即字符串结构),该模式描述在搜索文本时要匹配的一个或多个字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。

2.目的

  通过一个给定的正则表达式和一个字符串,可以达到:
  ①验证给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);
  ②通过正则表达式,从字符串中 提取我们想要的特定部分,比字符串的split、replace等方法更方便;

3.语法

  1. 创建正则表达式
    RegExp( )函数
var pat=new RegExp('a');//匹配包含a的字符串
   var str=prompt("")
   console.log(pat.test(str));

"abcd",返回

true

"bcd",返回

false

  test( )是正则表达式里的一种方法,语法:规则.test(字符串);  返回一个布尔值
  ②字面量表达式

var pat=/a/ //匹配包含a的字符串
   var str=prompt("")
   console.log(pat.test(str));

"abc",返回

true

"bc",返回

false

  二者的区别: ①字面量表达式在进行编译时就会自动新建正则表达式;②RegExp( )函数在运行时新建正则表达式;所以字面量表达式的效率更高,并且直观便利,所以在实际应用中,一般会使用字面量表达式。

  • RegExp( )函数还可以接收第二个参数,表示修饰符
var reg=new RegExp('abc',i)
   //等价于
   var reg=/abc/i;
  • 当正则表达式为空字符时 代表匹配所有字符
var str=prompt()
   var pat=new RegExp('')
   console.log(pat.test(str));
  1. 修饰符
      JavaScript里支持“i”、“g”、“m”三个修饰符

修饰符

说明

i

insensitive的缩写,定义不区分大小写字母

g

global的缩写,定义全局匹配,即在指定字符串范围内执行所有匹配

m

multiline的缩写,定义多行字符串匹配

4. 正则的方法

  1. RegExp.test( )
      test方法返回一个布尔值,表示当前是否能匹配参数字符串。
var str='I like cats.'
   var reg=/cat/ //验证是否包含cat
   console.log(reg.test(str));

true

  正则对象的lastIndex属性

  • 如果正则表达式带有g修饰符,则每一次test方法都从上一次结束的位置开始向后匹配。
var reg = /x/g;
   var str = '_x_x_x';
   console.dir(reg);//查看reg对象的方法
    
   console.log(reg.lastIndex) // 0 第一次位置从0开始查找
   console.log(reg.test(str)) // true
   console.log(reg.lastIndex) // 2 上一次test搜索时,找到的值的位置是2

   console.log(reg.test(str)) // true
   console.log(reg.lastIndex) // 4

   console.log(reg.test(str)) // true
   console.log(reg.lastIndex) // 6

   console.log(reg.test(str)) // false 搜索不到了
   console.log(reg.lastIndex) // 0  lastIndex属性重置为0,回到位置0

   console.log(reg.test(str)) // true 再次从0搜索
   console.log(reg.lastIndex) // 2 第二轮搜索

  g修饰符,表示全局搜索,会返回多个结果。上面五次使用test方法,每一次开始搜索的位置都是上一次匹配的后一个位置。

  • 带有g修饰符时,可以通过正则对象的lastIndex属性指定开始搜索的位置。
var reg=/x/g
   var str='_x_x'
   reg.lastIndex=4
   console.log(reg.test(str));//false

   console.log(reg.lastIndex);//0
   console.log(reg.test(str));//true

  指定从字符串的第五个位置开始搜索,这个位置为空,所以返回false。同时,lastIndex属性重置为0,所以第二次执行r.test(s)会返回true。

   注意: 带有g修饰符时,正则表达式内部会记住上一次的lastIndex属性,这时不应该更换所要匹配的字符串,否则会有一些难以察觉的错误。

var reg = /aa/g;
   reg.test('aa') // true
   reg.test('-aa-') // false

  上面代码中,由于正则表达式reg是从上一次的lastIndex位置开始匹配,导致第二次执行test方法时出现预期以外的结果。

  1. RegExp.exec( )

匹配结果,当匹配到时,返回一个数组,数组元素是匹配到的子字符串;当没有匹配到时,返回null

var str=prompt()
   var pat=/a/g
   console.log(pat.exec(str));

"abcd",返回


  exec方法返回数组的两个属性:
   >input:整个原字符串;
   >index:匹配到的子字符串的开始位置(从0开始计数);

  如果正则表达式包含圆括号(即含有“组匹配”)时,返回的数组会包括多个成员
    >第一个成员:整个匹配成功的结果,后面的成员就是圆括号对应的匹配成功的组;
    >第二个成员:对应第一个括号;
    >第三个成员:对应第二个括号,以此类推;
    >整个数组的length属性:等于组匹配的数量再加1;

var str='_x_x';
   var reg=/_(x)/;
   console.log(reg.exec(str))


  exec( )方法和字符串的match( )方法的区别:
   >非全局模式下:exec( )方法返回的数组与String.match( )方法返回的数组是相同的;
   >全局模式下:exec( )方法与String.match( )方法返回的结果不同。当调用 exec( )方法 时,会为正则表达式对象定义lastIndex属性,执行下一次匹配的起始位置,同时返回匹配数组,与非全局模式下的数组结构相同;而 String.match( ) 仅返回匹配文本组成的数组,没有附加信息。
   所以,在全局模式下获取完整的匹配信息只能用exec( )方法。