本篇接上篇聊聊 RegExp构造函数属性。
四. RegExp构造函数属性
RegExp 构造函数包含一些属性(这些属性在其他语言中被看成是静态属性)。这些属性适用于作用域中的所有正则表达式,并且基于所执行的最近一次正则表达式操作而变化。关于这些属性的另一个独特之处,就是可以通过两种方式访问它们。换句话说,这些属性分别有一个长属性名和一个短属性名(Opera 是例外,它不支持短属性名)。下表列出了 RegExp 构造函数的属性。
使用这些属性可以从 exec()或 test()执行的操作中提取出更具体的信息。看下面的例子。
var text = "this has been a short summer"; var pattern = /(.)hort/g; if (pattern.test(text)) { alert(RegExp.input); // this has been a short summer alert(RegExp.leftContext); // this has been a alert(RegExp.rightContext); // summer alert(RegExp.lastMatch); // short alert(RegExp.lastParen); // s alert(RegExp.multiline); // false }
以上代码创建了一个模式,匹配任何一个字符后跟 hort,而且把第一个字符放在了一个捕获组中。 RegExp 构造函数的各个属性返回了下列值:
- input 属性返回了原始字符串;
- leftContext 属性返回了单词 short 之前的字符串,而 rightContext 属性则返回了 short之后的字符串;
- lastMatch 属性返回最近一次与整个正则表达式匹配的字符串,即 short;
- lastParen 属性返回最近一次匹配的捕获组,即例子中的 s。
如前所述,例子使用的长属性名都可以用相应的短属性名来代替。只不过,由于这些短属性名大都不是有效的 ECMAScript 标识符,因此必须通过方括号语法来访问它们,如下所示。
var text = "this has been a short summer"; var pattern = /(.)hort/g; if (pattern.test(text)) { alert(RegExp.$_); // this has been a short summer alert(RegExp["$`"]); // this has been a alert(RegExp["$'"]); // summer alert(RegExp["$&"]); // short alert(RegExp["$+"]); // s alert(RegExp["$*"]); // false }
除了上面介绍的几个属性之外,还有多达 9 个用于存储捕获组的构造函数属性。访问这些属性的语法是 RegExp.$1、RegExp.$2…RegExp.$9,分别用于存储第一、第二……第九个匹配的捕获组。在调用 exec()或 test()方法时,这些属性会被自动填充。然后,我们就可以像下面这样来使用它们。
var text = "this has been a short summer"; var pattern = /(..)or(.)/g; if (pattern.test(text)) { alert(RegExp.$1); //sh alert(RegExp.$2); //t }
这里创建了一个包含两个捕获组的模式,并用该模式测试了一个字符串。即使 test()方法只返回一个布尔值,但 RegExp 构造函数的属性$1 和$2 也会被匹配相应捕获组的字符串自动填充。
好了,本篇文章就介绍到这儿,欢迎大家留言交流;喜欢或有帮助到您的话,点个赞或推荐支持一下!