本文实例讲述了JavaScript引用类型RegExp基本用法。分享给大家供大家参考,具体如下:
1、正则表达式定义
三个标志:全局模式g,不区分大小写模式i,多行模式m。
1) 字面量定义
var pattern = /[fe]at/gim;
2) 构造函数定义:
接收两个参数——要匹配的字符串模式和可选的模式字符串(g,i,m)。
var pattern = new RegExp("[fe]at","gim");
注意:
1) 若需要匹配的字符串中包含以下元字符,就必须对它们进行转义:( [ { \ ^ & | ) "font-size: medium">2、RegExp实例属性
- 1) global 表示是否设置了g标志。
- 2) ignoreCase 表示是否设置了i标志。
- 3) multiline 表示是否设置了m标志。
- 4) lastIndex 用于记录上一次匹配结束的位置,即下一次开始搜索下一个匹配项的位置,从0算起。
- 5) Source返回正则表达式的字符串表示,按照字面量模式返回而非传入构造函数的字符串模式返回。
var pattern = new RegExp("\\[fe\\]at","i"); alert(pattern.source);
以上代码返回\[fe\]at
3、RegExp实例方法
1) 继承的toLocaleString()
、toString()
、valueOf()
方法
toLocaleString()
:返回正则表达式的字面量,与创建正则表达式的方式无关。
toString()
:返回正则表达式的字面量,与创建正则表达式的方式无关。
valueOf()
:返回正则表达式本身。
var pattern1 = /\[fe\]at/i); var pattern2 = new RegExp("\\[fe\\]at","i"); alert(pattern1.toString()); // /\[fe\]at/i alert(pattern1.toLocaleString()); // /\[fe\]at/i alert(pattern2.toString()); // /\[fe\]at/i alert(pattern2.toLocaleString()); // /\[fe\]at/i
2) match()
方法
参数:用于匹配的正则表达式。
返回值:区分match()
的返回值主要是看是否设置g标志,没有设置g标志时与exec()
是等价的。
a. 如果设置g标志,那么返回的是包含所有匹配项的数组。
b. 如果没有设置g标志,那么返回的是包含第一个匹配项的数组,第0项是与整个正则表达式匹配的字符串,第1项是是与第1个子表达式相匹配的文本(如果有的话),第2项是与第2个子表达式相匹配的文本(如果有的话)。
3) exec()
方法
参数:要应用模式的字符串。
返回值:返回包含第一个匹配项信息的数组,没有匹配项的情况下返回null。exec()
的返回值不受g标志影响,在不设置g标志时,在同一个字符串上多次调用exec()
将会始终返回第一个匹配项的信息。即使设置了g标志,一次也只返回一个匹配项,但设置g标志时,每次调用exec()
都会在字符串中继续查找新匹配项,会驱动lastIndex可以模拟遍历所有匹配,可以与match()
设置g标志时等价(区别在于遍历所有匹配时,exec()
需要多次匹配,match()
一次匹配即可得到所有匹配)。
返回的数组包含额外的两个属性:index和input。其中,index表示匹配项在字符串中的位置,而input表示应用正则表达式的字符串。在数组中,第0项是与整个正则表达式匹配的字符串,第1项是是与第1个子表达式相匹配的文本(如果有的话),第2项是与第2个子表达式相匹配的文本(如果有的话)。
var str = "Shanghai and Beijing and Guangzhou"; var pattern = /Shanghai ( and Beijing ( and Guangzhou)"Shanghai and Beijing and Guangzhou" alert(match[0]);//"Shanghai and Beijing and Guangzhou" alert(match[1]);//"and Beijing and Guangzhou" alert(match[2]);//"and Guangzhou"
在不设置g标志的情况下,同一个字符串上调用exec()
始终返回第一个匹配项的信息。
var str = "fat eat"; var pattern = /.at/; var match = pattern.exec(str); alert(match.index);//0 alert(match.input);//fat eat alert(match[0]);//fat alert(pattern.lastIndex);//0 var match = pattern.exec(str); alert(match.index);//0 alert(match.input);//fat eat alert(match[0]);//fat alert(pattern.lastIndex);//0
设置全局标志g情况下,同一个字符串上调用exec()每次会返回一个新的匹配项的信息。
var str = "fat eat"; var pattern = /.at/g; var match = pattern.exec(str); alert(match.index);//0 alert(match.input);//fat eat alert(match[0]);//fat alert(pattern.lastIndex);//3 var match = pattern.exec(str); alert(match.index);//4 alert(match.input);//fat eat alert(match[0]);//eat alert(pattern.lastIndex);//7
4) test()
方法
参数:要应用模式的字符串
返回值:在模式与该参数匹配的情况下返回true,否则返回false。
test()
方法经常用于if语句中。
问题:
如果正则表达式带有标志g,使用test校验不同的字符串时,RegExp会使用test前一个字符串得出的lastIndex去test后一个字符串,必定出错。
var pattern = /^[1-9]\d{4,10}$/gi; var str = "88888"; alert(pattern.test(str));//返回true str = "888888"; alert(pattern.test(str));//返回false
解决方法:
① 将正则表达式的 lastIndex 属性设置为0 再用作校验
var pattern = /^[1-9]\d{4,10}$/gi; var str = "88888"; alert(pattern.test(str));//返回true str = "888888"; pattern.lastIndex=0; alert(pattern.test(str));//返回true
② 正则表达式去掉标志g
var pattern = /^[1-9]\d{4,10}$/i; var str = "88888"; alert(pattern.test(str));//返回true str = "888888"; alert(pattern.test(str));//返回true
5) 说明:
① exec()
和test()
是正则表达式的方法,而不是字符串的方法,它的参数才是字符串;match
是字符串的方法,而不是正则表达式的方法,它的参数才是正则表达式。
② 即使设置了g标志,exec()
每次只返回一个匹配项。没有设置g标志时,exec()
和match()
执行结果相同;设置g标志时,match()
将忽略子表达式,只查找全匹配正则表达式。
③ exec()
和match()
的区别:
a. 当正则表达式无子表达式,并且没有设置g标志时,exec()
和match()
执行结果相同,均返回第一个匹配的字符串内容。
var pattern = new RegExp("cat") ; var str = "onecat twocat"; alert(pattern.exec(str));//返回cat alert(str.match(pattern));//返回cat
b. 当正则表达式无子表达式,并且设置g标志时,exec()
返回第一个匹配的字符串内容,若存在多处匹配内容,则match()
返回的是包含所有匹配字符串的数组。
var pattern = new RegExp("cat","g") ; var str = "onecat twocat"; alert(pattern.exec(str));//返回cat alert(str.match(pattern));//返回cat,cat
c. 当正则表达式有子表达式,并且没有设置g标志时,exec()
和match()
执行结果相同,都查找全匹配正则表达式和子表达式,并返回包含全匹配字符串和匹配子表达式的数组。
var pattern = new RegExp("c(at)") ; var str = "onecat twocat"; alert(pattern.exec(str));//返回cat,at alert(str.match(pattern));//返回cat,at
d. 当正则表达式有子表达式,并且设置g标志时,exec()
和match()
执行的结果不相同,match()
将忽略子表达式,只查找全匹配正则表达式,并返回包含所有匹配字符串的数组。
var pattern = new RegExp("c(at)","g") ; var str = "onecat twocat"; alert(pattern.exec(str));//返回cat,at alert(str.match(pattern));//返回cat,cat
三个标志:全局模式g,不区分大小写模式i,多行模式m。
PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用:
JavaScript正则表达式在线测试工具:
http://tools.jb51.net/regex/javascript
正则表达式在线生成工具:
http://tools.jb51.net/regex/create_reg
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript正则表达式技巧大全》、《JavaScript替换操作技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》、《JavaScript中json操作技巧总结》、《JavaScript错误与调试技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]