JS中正则表达式
Posted 提升自己,才有选择的能力和勇气
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS中正则表达式相关的知识,希望对你有一定的参考价值。
正则表达式用于对字符串模式匹配及检索替换,是对字符串执行模式匹配的强大工具。简单来说正则表达式就是处理字符串的,我们可以用它来处理一些复杂的字符串。
创建方式
var reg = new RegExp(pattern,modifiers); //构造函数创建方式,pattern 和 modifiers 均为字符串, var reg = /pattern/modifiers; // 字面量创建方式
pattern(模式):描述了表达式的模式
modifiers(修饰符) :用于指定不区分大小写、全局匹配和多行匹配(i、g、m),当没有时默认为区分大小写只匹配第一个
字面量创建方式和构造函数创建方式的区别
1、字面量创建方式不能进行字符串拼接,实例创建方式可以
var regParam = ‘cm‘; var reg1 = new RegExp(regParam+‘1‘); var reg2 = /regParam/; console.log(reg1); // /cm1/ console.log(reg2); // /regParam/
2、字面量创建方式特殊含义的字符不需要转义,实例创建方式需要转义
var reg1 = new RegExp(‘d‘); // /d/ var reg2 = new RegExp(‘\d‘) // /d/ var reg3 = /d/; // /d/
修饰符
i:不区分大小写
var str = "Visit RUnoob"; var patt1 = /runoob/; var patt2 = /runoob/i; console.log(patt1.test(str)) //false console.log(patt2.test(str)) //true
g:全局匹配,(即查找所有匹配而非在找到第一个匹配后停止)
var str="Is this all there is?"; var patt1=/is/g; console.log( str.match(patt1) ); // ["is", "is"]
m:执行多行匹配。多行匹配在需要匹配的字符串里有换行符时凸显出它的意义。如果没有用多行匹配,那么不管多少换行符,该字符串就只视为一行,只有一对头和尾。如果使用了多行匹配,那么每一行就都有一对头和尾,使用 ^ 和 $ 进行匹配时结果就不一样。
var str="This an good"; var reg=/an$/; var reg2=/an$/m; console.log( reg.test(str) ); //false console.log( reg2.test(str) ); //true var str2="This an good an"; var reg3 = /an$/mg; console.log( str2.match(reg3) ); // ["an", "an"]
元字符: http://www.runoob.com/jsref/jsref-obj-regexp.html
d : 0-9之间的任意一个数字 d只占一个位置 w : 数字,字母 ,下划线 0-9 a-z A-Z _ s : 空格或者空白等 D : 除了d W : 除了w S : 除了s . : 除了 之外的任意一个字符 : 转义字符 | : 或者 () : 分组 : 匹配换行符 : 匹配边界 字符串的开头和结尾 空格的两边都是边界 => 不占用字符串位数 ^ : 限定开始位置 => 本身不占位置 $ : 限定结束位置 => 本身不占位置 [a-z] : 任意字母 []中的表示任意一个都可以 [^a-z] : 非字母 []中^代表除了 [abc] : abc三个字母中的任何一个 [^abc]除了这三个字母中的任何一个字符
代表次数的量词元字符
* : 0到多个 + : 1到多个 ? : 0次或1次 可有可无 {n} : 正好n次; {n,} : n到多次 {n,m} : n次到m次
正则表达式对象(RegExp)的方法
exec:返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。
reg.exec() 方法比较复杂,全局匹配和不全局匹配结果不一样,当用到分组时结果又不一样。
var str = ‘abc123cba456aaa789‘; var reg = /d+/; console.log( reg.exec(str) ) //["123", index: 3, input: "abc123cba456aaa789"]; console.log(reg.lastIndex) //0 // [ "123",index:3,input:"abc123cba456aaa789" ] 中, // "123" 表示我们捕获到的字符串 // index:3 表示捕获到的字符串的起始位置 // input 表示原有的字符串
当我们用exec进行捕获时,如果正则没有加 ‘g‘ 标识符,则exec捕获的每次结果都是同一个,当正则中有 ‘g‘ 标识符时捕获的结果就不一样了,再来看刚刚的例子
var str = ‘abc123cba456aaa789‘; var reg = /d+/g; //此时加了标识符g console.log(reg.lastIndex) // lastIndex : 0 console.log(reg.exec(str)) // ["123", index: 3, input: "abc123cba456aaa789"] console.log(reg.lastIndex) // lastIndex : 6 console.log(reg.exec(str)) // ["456", index: 9, input: "abc123cba456aaa789"] console.log(reg.lastIndex) // lastIndex : 12 console.log(reg.exec(str)) // ["789", index: 15, input: "abc123cba456aaa789"] console.log(reg.lastIndex) // lastIndex : 18 console.log(reg.exec(str)) // null console.log(reg.lastIndex) // lastIndex : 0 // 每次调用exec方法时, 捕获到的字符串都不相同 // lastIndex: 这个属性记录的就是下一次捕获从哪个索引开始,当未开始捕获时,这个值为0。 // 如果当前次捕获结果为null。 那么lastIndex的值会被修改为0.下次从头开始捕获。 // 而且这个lastIndex属性还支持人为赋值。
exec的捕获还受分组()的影响
let str = ‘aaabbb‘; let reg = /(a+)(b+)/; let reg2 = /(a+)(?:b+)/; console.log( reg.exec(str) ); //["aaabbb", "aaa", "bbb", index: 0, input: "aaabbb", groups: undefined] console.log( reg2.exec(str) ); //["aaabbb", "aaa", index: 0, input: "aaabbb", groups: undefined] //exec执行匹配的时候, 会先返回整体匹配值, 再分别返回按照正则表达式中由括号扩起来的小分组进行匹配的值。?: 可以取消返回该分组的匹配值。
以上是关于JS中正则表达式的主要内容,如果未能解决你的问题,请参考以下文章