JavaScript高级程序设计(第3版)学习笔记12 js正则(2)

   如果正则表达式中含有次数字符时,一般情况下,会尽可能匹配更多的字符,比如用l*n来匹配linjisong的话,会匹配linjison,而不是 lin,这种模式也就是正则表达式的贪婪模式;相对应的,可以通过添加字符“?”来设置为懒惰模式,也即尽可能匹配更少字符。如*?表示重复0次或多次, 但尽可能少重复。

5、分组和反向引用

(1)用小括号(())将表达式包含,可以使得表达式作为一个整体来处理,从而达到分组的目的。

(2)默认情况下,每个分组会自动获取一个组号,按照左括号的顺序,从1向后编号。

(3)引擎在处理时,会将小括号内部表达式匹配的内容保存下来,以方便在匹配过程中或匹配结束后进一步处理,可以使用反斜杠和组号来引用这个内容,如\1表示第一个分组匹配的文本。

(4)也可以自定义组名,语法是(?<name>exp),这个时候反向引用时,还可以使用\k<name>。

(5)也可以不保存匹配内容,也不分配组号,语法是(?:exp)。

(6)小括号有一些其他特殊语法,这里列举几种,不再深入讨论:

分类 代码/语法 说明
捕获 (exp)   匹配exp,并捕获文本到自动命名的组里  
(?<name>exp)   匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)  
(?:exp)   匹配exp,不捕获匹配的文本,也不给此分组分配组号  
零宽断言 (?=exp)   匹配exp前面的位置  
(?<=exp)   匹配exp后面的位置  
(?!exp)   匹配后面跟的不是exp的位置  
(?<!exp)   匹配前面不是exp的位置  
注释 (?#comment)   这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读  

到此,对于理解常用的正则表达式已经足够了,若想继续学习正则表达式的,可以参考正则表达式30分钟入门教程。下面再熟悉一下Javascript中的正则表达式实现。

二、Javascript中的正则表达式对象RegExp

1、创建正则表达式

(1)使用字面量:语法 var exp = /pattern/flags;

  A、pattern是任何正则表达式

  B、flags有三种:g表示全局模式、i表示忽略大小写、m表示多行模式

(2)使用RegExp内置构造函数:语法 var exp = new RegExp(pattern, flags);

  A、使用构造函数时,pattern和flags都是字符串形式,所以对于转义字符需要双重转义,例如:

字面量   构造函数  
/\[bc\]at/   "\\[bc\\]at"  
/\.at/   "\\.at"  
/name\/age/   "name\\/age"  
/\d.\d{1,2}/   "\\d.\\d{1,2}"  
/\w\\helllo\\123/   "\\w\\\\hello\\\\123"  

说明:ECMAScript 3使用字面量时会共享一个RegExp实例,使用new RegExp(pattern,flags)会为每个正则表达式创建一个实例;ECMAScript 5规定每次都创建新实例。

2、实例属性

(1)global:布尔值,表示是否设置了g标志。

(2)ignoreCase:布尔值,表示是否设置了i标志。

(3)multiline:布尔值,表示是否设置了m标志。

(4)lastIndex:整数,表示开始搜索下一次匹配项的字符位置,从0算起。

(5)source:字符串,表示按照字面量形式创建的字符串模式,即便实例使用构造函数创建,存储的也是字面量形式的字符串模式。

3、实例方法

(1)exec()方法

  A、一个参数,即要应用模式的字符串,返回第一个匹配项信息的数组,没有匹配时返回null。

  B、返回的数组是Array实例,但还额外有input和index属性,分别表示应用正则表达式的字符串和匹配项在字符串中的位置。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wddsdy.html