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