- 1、本文档共18页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
改善JavaScript程序的188个建议(41-50)
建议41:正确使用正则表达式引用
正则表达式在执行匹配运算时会自动把每个分组(子表达式)匹配的文本都存储在一个特殊的地方以备将来使用。这些存储在分组中的特殊值被称为反向引用。反向引用将遵循从左到右的顺序,根据表达式中左括号字符的顺序进行创建和编号。var s = abcdefghijklmn;var r = /(a(b(c)))/;var a = s.match(r); ?//[abc, abc , bc , c]
在这个分组匹配模式中,共产生了3个反向引用,第一个是“(a(b(c)))”,第二个是“(b(c))”,第三个是“(c)”。它们引用的匹配文本分别是字符串“abc”、“bc”和“c”。
反向引用在应用开发中主要有以下几种常规用法。
1)在正则表达式对象的test()方法,以及字符串对象的match()和search()等方法中使用。在这些方法中,反向引用的值可以从RegExp()构造函数中获得。例如:var s = abcdefghijklmn;var r = /(\w)(\w)(\w)/;r.test(s);alert(RegExp.$1); ??//第1个子表达式匹配的字符aalert(RegExp.$2); ??//第2个子表达式匹配的字符balert(RegExp.$3); ??//第3个子表达式匹配的字符c
在正则表达式执行匹配测试后,所有子表达式匹配的文本都被分组存储在RegExp()构造函数的属性内,通过前缀符号$与正则表达式中子表达式的编号来引用这些临时属性,其中属性$1标识符指向第一个值引用,属性$2标识符指向第二个值引用,依此类推。
2)可以直接在定义分组的表达式中包含反向引用。这可以通过使用特殊转义序列(如\l、\2等)来实现。例如:var s = abcbcacba;var r = /(\w)(\w)(\w)\2\3\1\3\2\1/;var b = r.test(s); ?// 验证正则表达式是否匹配该字符串alert(b); ???//true
在上面的正则表达式中,“\1”表示对第一个反向引用(\w)所匹配的字符a的引用,“\2”表示对第二个反向引用(\w)所匹配的字符b的引用,“\3”表示对第二个反向引用(\w)所匹配的字符c的引用。
3)可以在字符串对象的replace()方法中使用。通过使用特殊字符序列$1、$2、$3等来实现。例如,在下面的示例中将颠倒相邻字母和数字的位置。var s = aa11bb22c3d4e5f6;var r = /(\w+?)(\d+)/g;var b = s.replace(r,$2$1);alert(b); ???//11aa22bb3c 4d5e6f
在这个示例中,正则表达式包括两个分组,第一个分组匹配任意连续的字母,第二个分组匹配任意连续的数字。在replace()方法的第二个参数中,$1表示对正则表达式中第一个子表达式匹配文本的引用,而$2表示对正则表达式中第二个子表达式匹配文本的引用,通过颠倒$1和$2标识符的位置即可实现字符串的颠倒以替换原字符串。
建议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 Javascriptalert(RegExp.lastMatch); ?//Javascript alert(RegExp.lastParen); ?//Java
上面示例演示了正则表达式的几个静态属性的用法。
input属性实际上存储的是被执行匹配的字符串,即整个字符串“Javascript
文档评论(0)