资讯专栏INFORMATION COLUMN

JavaScript引用类型——“RegExp类型”的注意要点

mochixuan / 3160人阅读

摘要:类型通过类型来支持正则表达式。如由于构造函数的模式参数是字符串,所以在某些情况下要对字符串进行双重转义。而第二个循环使用构造函数在每次循环冲创建正则表达式。如另外,还有个用于存储捕获组的构造函数属性。

EegExp 类型

ECMAScript 通过RegExp 类型来支持正则表达式。语法如下:

var expression = / pattern / flags;

每个正则表达式都可带有一或多个标志(flags),正则表达式的匹配模式支持下列3 个标志。

g:表示全局(global)模式,该模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止;

i:表示不区分大小写(case-insensitive)模式,该模式在确定匹配项时忽略模式与字符串的大小写;

m:表示多行(multiline)模式,在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项;

如:

var pattern1 = /at/g; //匹配字符串中所有“at”的实例
var pattern2 = /[bc]at/i; //匹配字符串第一个“bat”或“cat”,不区分大小写
var pattern3 = /.at/gi; //匹配字符串中所有以“at”结尾的3个字符串的组合,不区分大小写

与其他语言中的正则表达式类似,模式中使用的所有元字符都必须转义。正则表达式中的元字符包括:

( [ {  ^ $ | ? * + . ] )

如:

var pattern1 = /[bc]at/i; //匹配第一个“[bc]at”,不区分大小写;
var pattern2 = /.at/gi; //匹配所有“.at”,不区分大小写;

另外,还可以使用RegExp 构造函数,它接收两个参数:一个是要匹配的字符串模式,另一个是可选的标志字符串。如:

var pattern1 = new RegExp("[bc]at","i");

由于RegExp 构造函数的模式参数是字符串,所以在某些情况下要对字符串进行双重转义。所有元字符串都必须双重转义,如 通常被转义为 ,而在正则表达式中就会变成 。如:

/[bc]at/             => [bc]at
/.at/                   => .at
/name/age/            => name/age
/d.d{1,2}/        => d.d{1,2}
/whello123/    => whello123

正则表达式字面两始终会共享同一个RegExp 实例,而使用构造函数创建的每一个新RegExp 实例都是一个新实例。如:

var re = null,i;

for (var i = 0; i < 10; i ++){
    re = /cat/g;
    re.test("catastrophe");
}

for (var i = 0; i < 10; i ++){
    re = new RegExp("cat","g");
    re.test("catastrophe");
}

对于第一个,由于会测试到字符串末尾,所以下次再调用test()就要从头开始。而第二个循环使用RegExp 构造函数在每次循环冲创建正则表达式。因为媒体迭代都会创建一个新的RegExp 实例,所以每次调用text()都会返回true。

RegExp 实例属性

global:布尔值,是否设置了g;

ignoreCase:布尔值,是否设置了i;

multiline:布尔值,是否设置了m;

lastIndex:整数,开始搜索下一个匹配项的字符位置,从0 开始算起;

source:正则表达式的字符串表示,按照字面量形式返回

如:

var pattern = new RegExp("[bc]at","i");
document.write(pattern.global); //false
document.write(pattern.ignoreCase); //true
document.write(pattern.multiline); //false
document.write(pattern.lastIndex); //0
document.write(pattern.source); //[bc]at

注意最后一个,source 属性保存的是规范形式的字符串,就是字面量形式所用的字符串。

RegExp 实例方法

主要有两个方法,一个是exec()方法,一个是test()方法。

exec()方法是专门为捕获组而设计的。接收一个字符串参数,然后返回包含第一个匹配项信息的数组;或者null;返回的数组还额外包含两个属性:index 和input。在数组中,第一项是与整个模式匹配的字符串,其他项是与模式中的不活组匹配的字符串。如:

var text = "mom and dad and baby";
var pattern = /mom( and dad( and baby)?)?/gi;

var matches = pattern.exec(text);
console.log(matches.index);
console.log(matches.input);
console.log(matches[0]);
console.log(matches[1]);
console.log(matches[2]);

/*
[Log] 0 (repetition.html, line 33)
[Log] mom and dad and baby (repetition.html, line 34)
[Log] mom and dad and baby (repetition.html, line 35)
[Log]  and dad and baby (repetition.html, line 36)
[Log]  and baby (repetition.html, line 37)
*/

因为整个字符串本身与模式匹配,所以返回的数组matches 的index 为0;数组中的第一项是匹配的整个字符串,第二项包含与第一个不活租匹配的内容,第三项包含与第二个捕获组匹配的内容。

第一个例子,这是一个全局模式:

var text = "this is a Global setting not a global function";
var pattern = /global/gi;

var matches = pattern.exec(text);
console.log(matches); //["Global"]
console.log(matches.index); //10
console.log(matches.input); //this is a Global setting not a global function
console.log(matches[1]); //undefined 这里没有捕获组
console.log(matches[0]); //Global
console.log(pattern.lastIndex); //16

matches = pattern.exec(text);
console.log(matches); //["global"]再次调用该exec()则继续查找新的匹配项
console.log(matches.index); //31
console.log(pattern.lastIndex); //37

第二个例子,这不是一个全局模式:

var text = "this is a Global setting not a global function";
var pattern = /global/i;

var matches = pattern.exec(text);
console.log(matches); //["Global"]
console.log(matches.index); //10
console.log(pattern.lastIndex); //0

matches = pattern.exec(text);
console.log(matches); //["Global"] 这里仍然是Global,说明非全局模式会从头开始搜索。
console.log(matches.index); //10
console.log(pattern.lastIndex); //0

全局模式,每次调用exec()都会返回字符串中的下一个匹配项;而非全局模式,每次调用exec()返回的都是第一个匹配项。

test()方法则是接收一个字符串参数。在模式与该参数匹配的情况下返回true;否则返回false。通常在只想知道目标字符串与某个模式是否匹配,但不需要知道文本内容的情况下,使用这个方法非常方便。

var text = "testing!";
var pattern = /est/gi;

if (pattern.test(text)){
    document.write("matched")
}else{
    document.write("not matched")
}
RegExp 构造函数属性

这些属性有一个长属性名也有一个短属性名。最常用的有两个:

leftContext($` input 字符串中lastMatch 之前的文本);

rightContext ($" input 字符串中lastMatch 之后的文本);

其他几个属性Opera 和IE 对此兼容不好。有:

input ($_ 最近一次要匹配的字符串);

lastMatch ($& 最近的一次匹配项);

lastParen ($+ 最近一次的捕获组);

multiline ($* 返回布尔值,表示是否所有表达式都使用多行模式);

如:

var text = "hello there";
var pattern = / /gi;
if(pattern.exec(text)){
    document.write("targeted" + "
"); document.write(RegExp.leftContext); document.write(RegExp.rightContext); }else{ document.write("missed" + "
"); }

又如:

var text = "hello there";
var pattern = / /gi;
if(pattern.exec(text)){
    document.write("targeted" + "
"); document.write(RegExp.input); //hello there document.write(RegExp.multiline); //false }else{ document.write("missed" + "
"); }

因为短属性名不是有效的标识符,因此必须通过方括号语法来访问它们。如RegExp["$""]

另外,还有9 个用于存储捕获组的构造函数属性。语法是RegExp.$1`RegExp.$2`等等。如:

var text = "this has been a short summer";
var pattern = /(..)or(.)/g;

if (pattern.test(text)){
    document.write(RegExp.$1);
    document.write(RegExp.$2);
}
模式的缺陷

具体访问模式的局限

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/86208.html

相关文章

  • JS语言核心——“正则表达式模式匹配”

    摘要:正则表达式一个描述字符模式的对象正则表达式的定义构造函数正则表达式直接量一对斜杠新特性正则的扩展引用类型类型的注意要点用于模式匹配的方法不支持全局搜索忽略表达式参数中的修饰符两个参数第一个是正则表达式,第二个是要替换的字符串接收一个正则表达 正则表达式(regular expression):一个描述字符模式的对象 1 正则表达式的定义 RegExp()构造函数 正则表达式直接量(一...

    李世赞 评论0 收藏0
  • JavaScript面向对象编程——RegExp类型

    摘要:由于某些字符类非常常用,的正则表达式中,使用特殊转义字符表示他们。多行搜索代码示例对象创建对象可以通过引用类型创建正则表达式对象参数参数被称为模式,可以使任何简单或复杂的正则表达式,包含字符类限定符分组向前查找以及反向引用等。 概述 正则表达式是什么 正则表达式(RegularExpression):由一些普通字符和特殊字符组成的,用以描述一种特定的字符规则的表达式。正则表达式常用在一...

    Magicer 评论0 收藏0
  • RegExp类型于String类型简介

    摘要:被称之为修饰符,用于表明正则表达式的行为。创建对象如下代码类型于类型之间的区别使用运算符,类型返回,类型返回。提取字符串中的两个指定的索引号之间的字符。在字符串中查找匹配的子串,并替换于正则表达式匹配的字串。 RegExp类型 概述 正则表达式时什么 正则表达式(Regular Expression):由一些普通字符和特殊字符组成的,用以描述一种特定的字符规则的表达式。正则表达式常用于...

    fancyLuo 评论0 收藏0
  • JavaScript知识点总结(二)

    摘要:变量作用域垃圾收集内存问题基本类型和引用类型中的变量包含基本类型值和引用类型值基本类型值指的是简单的数据段引用类型值值那些可能有多个值构成的对象五种基本数据类型的值即基本类型值是按值访问的因此操作的是保存在变量中实际的值引用类型值是保存在内 变量, 作用域, 垃圾收集(内存问题) 基本类型和引用类型 ES中的变量包含基本类型值和引用类型值 基本类型值指的是简单的数据段 引用类型值值那些...

    wapeyang 评论0 收藏0
  • Javascript变量注意要点

    摘要:如很明显可以看到,实际上是函数的局部变量。简单的说就是,复制给参数,在函数内部是局部变量,无论怎么变化,都不影响的变化。 ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值。 基本类型和引用类型的值 基本类型值(String,Number,Boolean,Null,Undefined)指的是简单的数据段;引用类型值(保存在内存中的对象)指的是那些可能由多个值...

    booster 评论0 收藏0

发表评论

0条评论

mochixuan

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<