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

前言

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

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表示应用正则表达式的字符串。在数组中,第一项是整个个正则匹配的字符串,其余项是与正则中分组匹配的字符串(若是该正则没有分组捕获,则该数组只包含一项)。express

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()则都返回在字符串中继续查找新的匹配项bash

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中ui

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

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

    

RegExp构造函数函数的属性

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


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


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

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

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

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

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

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


       除了上面简介的几个属性以外,还有多达9个用于存储捕获的组的构造函数属性。访问这些属性的语法使RegExp.$一、RegExp.$二、RegExp.$三、RegExp.$四、......RegExp.$9,分别用于存储第1、第2、第三.......第九个匹配的捕获组。在调用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 正则表达式仍然是很是强大的,可以帮咱们完成绝大多数模式匹 配任务。这些属性中小伙伴们是否是有好多没有见过的**

相关文章
相关标签/搜索