建议42:用好正则表达式静态值
正则表达式的静态属性比较特殊,有两个名字:长名(全称)和短名(简称,以美元符号开头表示),详细说明见表2.1。
表2.1 RegExp的静态属性
长名 短名 说明
input $_ 最后用于匹配的字符串,即传递给exec()或test()方法的字符串
lastMatch $& 最后匹配的字符
lastParen $+ 最后匹配的分组
leftContext $` 在上次匹配之前的子字符串
multiline $* 用于指定是否所有表达式都使用多行模式的布尔值
rightContext $' 在上次匹配之后的子字符串
在下面的这个示例中借助正则表达式的静态属性,匹配字符串“Javascript”,不区分大小写:
var s = "Javascript,not Javascript";
var r = /(Java)Script/gi;
var a = r.exec(s);
alert(RegExp.input); //"Javascript,not Javascript"
alert(RegExp.leftContext); //空字符串,因为在第一次匹配操作时,左侧没有内容
alert(RegExp.rightContext); //",not Javascript"
alert(RegExp.lastMatch); //"Javascript "
alert(RegExp.lastParen); //"Java"
上面示例演示了正则表达式的几个静态属性的用法。
input属性实际上存储的是被执行匹配的字符串,即整个字符串“Javascript,not Javascript”。
leftContext属性存储的是执行第一次匹配之前的子字符串,这里为空,因为在第一次匹配时文本“Javascript”左侧为空,而rightContext属性存储的是执行第一次匹配之后的子字符串,即为“,not Javascript”。
lastMatch属性包含的是第一次匹配的子字符串,即为“Javascript”。
lastParen属性包含的是第一次匹配的分组,即为“Java”。如果模式中包含多个分组,则会显示最后一个分组所匹配的字符。例如:
var r = /(Java)(Script)/gi;
var a = r.exec(s); //执行匹配操作
alert(RegExp.lastParen); //返回"Script",而不再是"Java"
也可以使用短名来读取这些属性所包含的值,考虑到这些短名不符合JavaScript语法规范,因此必须使用中括号运算符来进行读取操作。不过对于$_属性来说,由于它符合JavaScript标识符语法规范,因此可以直接使用。例如,针对上面示例也可以这样设计:
var s = "Javascript,not Javascript";
var r = /(Java)(Script)/gi;
var a = r.exec(s);
alert(RegExp.$_); //"Javascript,not Javascript"
alert(RegExp["$`"]); //空字符串
alert(RegExp["$'"]); //",not Javascript"
alert(RegExp["$&"]); //"Javascript "
alert(RegExp["$+"]); //"Java"
这些属性的值都是动态的,每次执行exec()或test()方法时,所有属性值都会被重新设置。当在下面示例中执行第一次匹配和第二次匹配时,这些静态属性值都会实时动态更新。
var s = "Javascript,not Javascript";
var r = /Scrip(t)/gi; // 第一次定义的匹配模式
var a = r.exec(s); // 执行第一次匹配
alert(RegExp.$_); //"Javascript,not Javascript"
alert(RegExp["$`"]); //"Java"
alert(RegExp["$'"]); //",not Javascript"
alert(RegExp["$&"]); //"Script"
alert(RegExp["$+"]); //"t"
var r = /Jav(a)/gi; // 第二次定义的匹配模式
var a = r.exec(s); // 执行第二次匹配
alert(RegExp.$_); //"Javascript,not Javascript"
alert(RegExp["$`"]); //空字符串
alert(RegExp["$'"]); //"Script,not Javascript"
alert(RegExp["$&"]); //"Java"
alert(RegExp["$+"]); //"a"
通过上面的示例可以看出,RegExp对象的静态属性是公共的,对于所有正则表达式来说是可以共享的,因此这些静态属性的值也是实时变化的。
multiline属性与上面几个属性不同,它不会根据每次执行的操作进行实时更新,并且还可以控制所有正则表达式的m标志项。例如:
var s = "anbnc";
var r = /w+$/g; // 定义匹配模式
var a = s.match(r); // 执行默认匹配,返回数组["c"]
RegExp.multiline = true; // 动态设置模式为多行匹配
var a = s.match(r); //["a", "b", "c"]
提示:IE和Opera浏览器不支持RegExp.multiline属性,考虑到浏览器的兼容性,不建议读者使用这种动态方式设置正则表达式的多行匹配模式。

JS编程建议——42:用好正则表达式静态值相关推荐

  1. JS编程建议——37:推荐使用replace(1)

    建议37:推荐使用replace(1) String对象的replace方法包含两个参数,第一个参数表示执行匹配的正则表达式,也可以传递字符串,第二个参数表示准备代替匹配的子字符串,例如,把字符串ht ...

  2. JS编程建议——8:谨慎使用运算符(3)

    建议8:谨慎使用运算符(3) 要确保变量a的值为连续运算,可以使用小括号逻辑分隔符强迫4个数值先进行连续运算,然后再赋值. a = (1, 2, 3, 4); alert(a); //4 当使用var ...

  3. JS编程建议——7:小心保留字的误用

    建议7:小心保留字的误用 JavaScript语言中定义了很多备用或已经使用的保留字,按首字母顺序列出的保留字. 这些单词中的大多数并没有在语言中使用,但是根据JavaScript语法规则,这些单词是 ...

  4. JS编程建议——2:正确辨析JavaScript句法中的词、句和段

    建议2:正确辨析JavaScript句法中的词.句和段 JavaScript语法包含了合法的JavaScript代码的所有规则和特征,它主要分为词法和句法.词法包括字符编码.名词规则.特殊词规则等.词 ...

  5. JS编程建议——52:建议使用splice删除数组

    建议52:建议使用splice删除数组 删除数组元素的方法有多种,最简单的方法是利用length属性来截断数组,但这种方法比较笨拙,仅能够截断尾部元素.在JavaScript中,由于数组其实就是对象, ...

  6. JS编程建议——32:使用制表

    建议32:使用制表 代码所做的事情越少,它的运行速度就越快,因此,避免重复工作很有意义.多次执行相同的任务也在浪费时间.制表法通过缓存先前计算结果为后续计算所使用,避免了重复工作,这使得制表成为递归算 ...

  7. 前端利器—1—转型JS编程

    JS作为前端开发的必备语言工具,虽然JS对非编程人员来说比较容易上手,但是,要真正的精通JS开发,尚且假设学习过c++.java等面向对象语言的一种.因为对oo开发人员,迅速掌握JS的开发要点,是顺利 ...

  8. 正则表达式把html中换行去掉,JS去除空格和换行的正则表达式(推荐)

    前几天在编程的时候,遇到一件问题折腾了很久才解决了,真把我气疯了!把一个字符串放到setTimeout里面没法执行方法,后来发现是因为字符串后面多了一个换行,不仔细看看不出来,使用正则表达式去除换行就 ...

  9. 微信小程序开发日志——面向对象的JS编程

    微信小程序开发日志--面向对象的JS编程 前言 不知道有多少小伙伴和之前的我一样,微信小程序的js部分都是用面向过程的方式写的,最后的结果就是代码非常长,其实刚刚写完还好,自己也都清楚哪些部分是做什么 ...

最新文章

  1. tomcat简单配置
  2. 疾控中心计算机管理员权限,疾控中心健康证分权限管理系统使用说明
  3. 60万元奖金 “人脸攻防战”,怎么打?丨独家公开课实录(附baseline)
  4. VSCode 初次写vue项目并一键生成.vue模版
  5. 利用Deep Reinforcement Learning训练王者荣耀超强AI
  6. 【汇编语言】上机实验 win7/8/10 64位系统 进入32位DOS模式 实现dubug/edit/masm/link功能
  7. 架构设计 | 分布式系统调度,Zookeeper集群化管理
  8. SpringBoot-EnvironmentPostProcessor
  9. 如何在IOS平台上使用js直接调用OC方法
  10. shell php的守护进程,实例详解shell编写守护进程的方法
  11. 面对最菜TI战队,OpenAI在Dota2上输的毫无还手之力
  12. Unity Koreographer 之 音乐制作插件介绍学习,一般使用步骤介绍(包括:一般音乐游戏制作流程简绍) 一
  13. php win8 下载64位下载,万能驱动助理(e驱动) Win8.1 64位专版 6.6 官方版
  14. 简单工具之 ---- IP地址快速修改脚本
  15. [转载]Windows系统的错误报告保存在哪个文件夹里?
  16. 目前可用的通用DNS
  17. win10检测不到第二个显示器怎么解决 win10外接显示器黑屏怎么办
  18. opencv 判断点在多边形内外
  19. 易桌面打印室一般多久能到,易桌面打印室怎么用
  20. 历年siggraph

热门文章

  1. Spring Boot-Spring Tool Suit + Gradle 构建第一个Spring Boot 项目02
  2. AS主题+配置备份+Logcat颜色配置
  3. CSDN内容颜色、位置以及图片大小改变
  4. idea打开项目慢怎么办?
  5. 离散度计算公式 python_被多种离散化场景困扰?8种python技巧!让数据处理更简单...
  6. 机器学习:论相关(一)
  7. android小部件如何实时更新,android – 使用AlarmManager手动更新小部件
  8. 卷组删除pv_Linux LVM(逻辑卷管理)的删除
  9. 怎么关闭微信微众银行账户服务器,微信微众银行要怎么关闭,微信微众银行注销方法...
  10. 学校通用计算机保护,浅谈学校计算机教室软件系统的保护.docx