JavaScript编程精解第九章:正则表达式

来源:互联网 发布:杜兰特2016西决数据 编辑:程序博客网 时间:2024/06/04 00:21

正则表达式是表示字符串模式的对象,使用自己的语法来表达这些模式:

  • /abc/:字符序列
  • /[abc]/:字符集中的任何字符
  • /[^abc]/:任何不在字符集中的字符
  • /[0-9]/:任何在字符范围内的字符
  • /x+/::x出现一次以上,贪婪模式(尽可能多)
  • /x+?/:x出现一次以上,非贪婪模式(尽可能少)
  • /x*/:x出现0次以上
  • /x?/:x出现0或一次
  • /x{2,4}/:x出现2-4次
  • /(abc)/:元组
  • /a|b|c/:匹配abc中任一模式
创建
  1. 使用RegExp构造函数
  2. 使用斜杠字符
  3. 使用i不区分大小写 或 g开启全局模式

差异

构造函数时,模式书写为普通字符串,因此,反斜杠使用与往常相同。(即 \ 不为转义字符的一部分时会被忽略,\ 需要转义,\b会被表示成特殊字符,需要写成\\b),

如 new RegExp('\\bab\c\\b');   /*  相当于 /\babc\b/  */  

         斜杠字符时,如果反斜杠不是特殊字符代码的一部分时,将会被保留,一些在正则表达式中有特殊含义的字符,需要在其以前使用反斜杠,

如 //babc/+/b/;   /*   表示单词 abc+ */

属性

source:包含用于创建正则表达式的字符串

lastIndex:全局模式时,指定字符串中的起始匹配位置,初始值为0。

方法

test();  //返回布尔值

 exec(); //返回表示字符串信息的对象(字符串数组)或 NULL,包括匹配的字符串,分别与各分组匹配的部分字符串或undefined,index属性表示字符串成功匹配的起始位置,input属性表示验证的字符串。

回溯

进入一个分支时,匹配器会记住当前位置,若当前分值无法匹配,可以回退并尝试另一条分支。

一旦字符串与模式完全匹配,匹配器就会停止。这意味着多个分支都可能匹配一个字符串,但匹配器最后只会使用第一条分支(使用+,*等重复模式运算符时需要小心

(贪婪模式))

全局模式

但启用全局,并使用exec匹配模式时,正则表达式会自动lastIndex属性,来指向匹配后字符串后的位置。如果无法匹配,会将lastIndex清零。

若使用同一个全局正则表达式对象多次调用exec,自动更新lastIndex属性可能造成问题。正则表达式可能恰好处于前一次调用exec之后剩余字符的起始位置。

 var digit = /\d/g;

consple.log(digit.exec(''here it is: 1''));

// [''1'']     lastIndex为13

console.log(digit.exec(''and now: 1''));

// null      lastIndex为0

全局选项会改变match匹配字符串的工作方式,match会找出所有匹配模式的字符串,并返回一个包含所有匹配字符串的数组,而不是非全局模式时像exec返回的数组。

因此,使用全局正则表达式时需要倍加小心。只有确实需要全局表达式即调用replace方法时,或是需要显式使用lastIndex时。


循环匹配:由于全局模式下会自动更新lastIndex值,所以可以使用全局模式和exec循环匹配整个字符串。


字符串方法

replace:可使用正则表达式,可开启全局模式,替换字符串①可使用函数,参数分别为匹配字符串 和 各元组匹配的字符串(可选)②可使用元组 , 如 ''hopper,grace''.replace(/([\w]+),([\w]+)/, ''$2 $1''); //替换成 grace hopper;

search:参数为正则表达式,返回首先匹配的表达式的索引或-1;

match:全局模式下返回所有匹配的字符串组成的数组,非全局模式下,返回与exec返回数组格式相同(包含所有匹配元组)的数组。


原创粉丝点击