进阶篇:贪婪模式 (9-2)

2019-05-23  本文已影响0人  饥人谷1904_陈俊锋

饥人谷学习进阶第 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()方法返回对象还包括两个属性

  1. index属性声明的是匹配文本的第一个字符的位置
  2. 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"]

详细相关方法

上一篇 下一篇

猜你喜欢

热点阅读