饥人谷学习进阶第 9 天
贪婪模式与非贪婪模式
量词在默认下是尽可能多的匹配的,也就是所谓的贪婪模式
举例:
var str = 'a "witch" and her "broom" is one';
str.match(/".*"/g);
运行结果为:"witch" and her "broom"
,因为贪婪模式起作用。
贪婪模式
在贪婪(默认)模式下,正则引擎尽可能多的重复匹配字符
/".*"/g
非贪婪模式
通过在代表数量的标示符后放置?
来开启非贪婪模式。在非贪婪模式下,正则引擎尽可能少的重复匹配字符
/".*?"/g
了解一下查找算法
正则引擎正向及回溯
分组
使用量词的时候匹配多个字符
/(hugner){10}/
使用()
达到将hugner作为一个整体的目的,即为分组
或
var reg1 = /hello|world/
//等同于
var reg2 = /(hello)|(world)/
分组嵌套
从HTML字符串中取出URL
var str = '<a href="http://jirengu.com">"饥人谷"</a>'
var reg = /href="((https?:)?\/\/.+?)"/
console.log(reg) //["href="http://jirengu.com"", "http://jirengu.com", "http:"]
var url = str.match(reg)[1]
前瞻
表达式 | 含义 |
---|---|
exp1(?=exp2) | 匹配后面是exp2的exp1 |
exp1(?!exp2) | 匹配后面不是exp2的exp1 |
例子:
hunger(?=Byron)
(/good(?=Byron)/).exec('goodByron123'); // ['good']
(/good(?=Byron)/).exec('goodCasper123'); //null
(/bad(?=Byron)/).exec('goodCasper123'); //null
通过上面例子可以看出 exp1(?=exp2)
表达式会匹配exp1表达式,但只有其后面内容是exp2
的时候才会匹配,也就是两个条件,exp1(?!exp2)
类似
good(?!Byron)
(/good(?!Byron)/).exec('goodByron123'); //null
(/good(?!Byron)/).exec('goodCasper123'); //['good']
(/bad(?!Byron)/).exec('goodCasper123');//null
相关方法
RegExp.prototype.test(str)
用于测试字符串参数中是否存在正则表达式模式,如果存在则返回true,否则返回false
var reg = /\d+\.\d{1,2}$/g
reg.test('123.45'); //true
reg.test('0.2'); //true
reg.test('a.34'); //false
reg.test('34.5678'); //false
RegExp.prototype.exec(str)
用于正则表达式模式在字符串中运行查找,如果exec()
找到了匹配的文本,则返回一个结果数组,否则返回null
除了数组元素和length属性之外,exec()
方法返回对象还包括两个属性
- index属性声明的是匹配文本的第一个字符的位置
- input属性则存放的是检索的字符串string
String.prototype.split(reg)
使用split方法把字符串分割成字符数组
和replace方法类似,在一些复杂的分割情况下我们可以使用正则表达式解决
'a1b2c3d'.split(/\d/); // ["a", "b", "c", "d"]
'j l sd iod ifhs jlfj'.split(/\s*/); // ["j", "l", "s", "d", "i", "o", "d", "i", "f", "h", "s", "j", "l", "f", "j"]
网友评论