正则方法和属性的使用---包括你没有见过的哦

433 阅读6分钟

前言

    上篇文章我们看正则的一些正常使用和一些需要记忆的元字符。接下来将展示正则的实例、方法、以及你们没有见过的属性。

RegExp的实例和属性

    RegExp的每个实例都具有下列属性,通过这些属性可以取得关键的各中信息。
  • global : 布尔值,表示是否设置了g标志。
  • ignoreCase:布尔值,表示是否设置了i标志。
  • lastIndex:整数,表示开始搜索下一个匹配项字符串位置,从0起。
  • multiline:布尔值,表示是否设置了m标志。
  • source: 正则表达式的字符串表示,按照字面量形式表示而非传入构造函数中的字符串模式返回。

    通过这些属性可以获知一个正则表达式的各方面信息,但是却没有大用处,因为这些信息全都包含在模式声明中。例如:

var  reg = /\[bc\]at/i;
console.log(reg.global);// false
console.log(reg.igoreCase);//true
console.log(reg.miltiline);//false
console.log(reg.lastIndex);//0
console.log(reg.source);//'\[bc\]at'

var  reg1 = new RegExp('\\[bc\\]',i);
console.log(reg1.global);// false
console.log(reg1.igoreCase);//true
console.log(reg1.miltiline);//false
console.log(reg1.lastIndex);//0
console.log(reg1.source);//'\[bc\]at'

RegExp的实例方法

    RegExp对象的主要方法是exec(),该方法专门为捕获”组“而设计的。exec()接受一个参数,要被匹配捕获的字符串,然后返回包含第一个匹配信息的数组;或者在没有匹配人会情况下返回null。返回的数组虽然是Array的实例,但包含两个额外的属性;index和input。其中index表示匹配项在字符中的位置,而input表示应用正则表达式的字符串。在数组中,第一项是整个个正则匹配的字符串,其他项是与正则中分组匹配的字符串(如果该正则没有分组捕获,则该数组只包含一项)。

var text = 'mom and dad and baby';
var reg = /mom(and dad(and baby)?)?/gi;
var matches = reg.exec(text);
conole.log(matches.index);//0
conole.log(matches.input);//'mom and dad and baby'
conole.log(matches[0]);//'mom and dad and baby'
conole.log(matches[1]);//'and dad and baby'
conole.log(matches[2]);//'and baby'

    上面的例子是不是验证咱们说的匹配规则,exec() 方法执行的结果,如果正则匹配成功就会返回一个数组(数组的index,表示正则匹配的位于字符串的位置,数组的第一项是整个正则匹配的内容,数组的第二项是正则第一个分组捕获内容,第三项,是正则第二个分组捕获内容),不成功就会返回一个null。

    对于exec()方法而言,即使在正则中设置了全局模式g,它每次也会返回一个匹配项信息。在没有设置全局标志的情况下,在同一个字符串多次调用exec()将始终返回第一个匹配项的信息。而咋设置全局标志的情况下,每次都调用exec()则都返回在字符串中继续查找新的匹配项

var  text = 'cat,bat,sat,fat';
var reg = /.at/;
var res = reg.exec(text)
console.log(res.index);//0
console.log(res[0]);//cat
console.log(res.lastIndex);//0

res = reg.exec(text)
console.log(res.index);//0
console.log(res[0]);//cat
console.log(res.lastIndex);//0

reg = /.at/g;
var res = reg.exec(text)
console.log(res.index);//0
console.log(res[0]);//cat
console.log(res.lastIndex);//3

var res = reg.exec(text)
console.log(res.index);//5
console.log(res[0]);//bat
console.log(res.lastIndex);//8

var res = reg.exec(text)
console.log(res.index);//10
console.log(res[0]);//sat
console.log(res.lastIndex);//13

var res = reg.exec(text)
console.log(res.index);//15
console.log(res[0]);//fat
console.log(res.lastIndex);//18

var res = reg.exec(text)
console.log(res.index);//19
console.log(res);//null
console.log(res.lastIndex);//19

    切记在使用正则exec()方法的时候,想不断的匹配整个字符串的话,需要添加i标志IE 的 JavaScript 实现在 lastIndex 属性上存在偏差,即使在非全局模式下, lastIndex 属性每次也会变化。

    正则表达式的第二个方法 test(),它就是一个字符串参数,在能匹配成功的情况下返回 true,否则返回false。在只想知道目标字符串与该正则是否匹配的情况下,使用这个方法非常方便。因此,test常用在if中

var text = '000-00-0000';
var reg = /\d{3}-\d{2}-\d{4}/;
if(reg.test(test)){}
console.log('The pattern was matched.')

    相信小伙伴们对上面的属性和方法很熟悉,接下来看看,咱们都不太熟悉的属性吧

    

RegExp构造函数函数的属性

     RegExp构造函数包含一些属性(这些属性在其他的语言版本中看成是静态属性)。这些属性适合于所有的正则表达式,并基于所执行的最后一次正则表达式操作而变化。关于这些属性的另一个独特之处,可以通过两种方式范文他们。换句话来说,这些属性分别有一个长属性名和一个短属性名(opera是个例外,它不支持短属性名)。下面列出构造函数的属性


长属性名称                                短属性名称                                                说明


input                                                $_                                      最近一次要匹配的字符串。Opera未实现此属性

lastMatch                                                $&                                      最近一次要匹配项。Opera未实现此属性

lastParent                                                $+                                      最近一次匹配的捕获组。Opera未实现此属性

leftContent                                                $`                                      input字符串中lastMatch之前的文本。

multiline                                                $*                                      布尔值,表示是否所有表达式都使用多行模式。IE和Opera未实现此属性

rightContent                                                $'                                      Input字符串中lastMatch之后的文


       除了上面简介的几个属性之外,还有多达9个用于存储捕获的组的构造函数属性。访问这些属性的语法使RegExp.$1、RegExp.$2、RegExp.$3、RegExp.$4、......RegExp.$9,分别用于存储第一、第二、第三.......第九个匹配的捕获组。在调用exec()或test()方法时,这些属性会被自动填充。然后我们就可以这样使用它们。

var text = 'this has benn a  short summer';
var reg = /(..)or(.)/g;
if(reg.test(text)){
    console.log(RegExp.$1)// sh
    console.log(RegExp.$2)//t
}

      这里创建一个包含两个捕获组正则,并用正则的test()方法去匹配该字符串,虽然test()方法只返回一个布尔值,单Regxp构造函数的属性$1和$2也会返匹配响应捕获组的字符串自动填充

RegExp的局限性

      尽管 ECMAScript 中的正则表达式功能还是比较完备的,但仍然缺少某些语言(特别是 Perl)所支 持的高级正则表达式特性。下面列出了 ECMAScript 正则表达式不支持的特性(要了解更多相关信息, 请访问 www.regular-expressions.info)。
  • 匹配字符串开始和结尾\A和\Z(但支持以插入符号(^)和美元符号($)来匹配字符串的开始和结尾)
  • 向后查找(但完全支持向前查找(lookahead)。)
  • 并集和交集
  • 原子组
  • Unicode 支持(单个字符除外,如\uFFFF)
  • 命名的捕获组 (但支持编号的捕获组。)
  • s(single,单行)和 x(free-spacing,无间隔)匹配模式
  • 条件匹配
  • 正则表达式注释

** 即使存在这些限制,ECMAScript 正则表达式仍然是非常强大的,能够帮我们完成绝大多数模式匹 配任务。这些属性中小伙伴们是不是有好多没有见过的**