欢迎来真孝善网,为您提供真孝善正能量书籍故事!

深入掌握正则表达式技巧:进阶学习指南

时间:11-08 现代故事 提交错误

文字

var reg=/bisb/g;

"他是一个男孩。这是一只狗。她在哪里?".replace(reg,"IS");

//"他是个男孩。这是一只狗。她在哪里?"构造函数

var reg=new RegExp("\bis\b","g");

"他是一个男孩。这是一只狗。她在哪里?".replace(reg,"IS");

//"他是个男孩。这是一只狗。她在哪里?"

修饰符:

g : 全局全文搜索,如果不添加,搜索将停止在第一个匹配处。 I:ignore case 忽略大小写,默认区分大小写。 m:multiple rows 多行搜索

元字符:

正则表达式由两种基本字符类型组成: 文字文本字符元字符字符含义水平制表符v垂直制表符n换行符rcarriage return 空字符f 换页符cX 和控件对应**的字符(ctrl+x)

字符类:

我们可以使用元字符[]来构建一个简单的类

所谓类,是指符合某种特征的对象,是一般性的指称,而不是具体的特征。

表达式[abc]将字符a或b或c归为一类,该表达式可以匹配这一类字符。

"a1b2c3d4".replace(/[a,b,c]/g,"X");

//X1X2X3d4

字符类取反:

使用元字符^创建反向类/负类

反向类别是指不属于某个类别的内容

表达式[^abc] 表示不是字符a、b 或c 的内容

"a1b2c3d4".replace(/[^a,b,c]/g,"X");

//a1b2c3X4

范围类

正则表达式也提供范围类

所以我们可以用[a-z]连接两个字符来表示a到z的任意字符

这是一个闭区间,即它包含a和z本身。

[a-zA-Z]可以在由[]组成的类中连续写入

"a1b2d3x4z9".replace(/[[a-z]/g,"Q");

//Q1Q2Q3Q4Q9

预定义类

字符含义。除回车符和换行符之外的所有字符d数字字符D非数字字符s空白字符S非空白字符w单词字符(字母、数字和下划线)W非单词字符匹配ab+数字+any的字符串特点

/abd./

边界

正则表达式还提供了几种常用的边界匹配字符

字符含义^ 以xxx 开头$ 以xxx 结尾b 单词边界B 非单词边界"这是一个男孩".replace(/Bisb/g,"0");

//Th0 是个男孩

"这是一个男孩".replace(/bisb/g,"0");

//这个0是一个男孩

var mulStr="@123

@456

@789";

mulStr.replace(/^@d/gm,"X");

//"X23

X56

X89"

量词

字符含义?出现零次或一次(最多一次) + 出现一次或多次(至少一次) 出现零次或多次(任意次数) {n} 出现n 次{n, m} 出现n 到m 次{n, }

贪婪模式

至少出现n 次以匹配尽可能多的

"12345678".replace(/d{3,6}/g,"X");

//X78

非贪婪模式

让正则表达式匹配的次数尽可能少,即一旦匹配成功就不再尝试,属于非贪婪模式。

方法很简单,添加?量词后面?就是这样

"123456789".match(/d{3,5}?/g);

//["123","456","789"]

分组

使用()实现分组功能,使量词作用于分组

匹配字符串Byron连续出现3次的场景

"a1b2c3d6".replace("/([a-z]d){3}/g,"X");

//Xd4 或

使用|达到或者的效果

"ByronCasper".replace(/Byron|Carper/g,"X");

//"XX"

"ByronsperByrCasper".replace(/Byr(on|Ca)rper/g,"X");

//"XX"

反向引用

"2016-11-25".replace(/(d{4})-(d{2})-(d{2})/g,"$2/$3/$1");

//11/25/2016

忽略分组

不想捕获某些组,只需将它们添加到组中? 就是这样

前瞻

正则表达式从文本的头部到末尾进行解析。文本尾部的方向称为“向前”。前瞻意味着当正则表达式匹配某个规则时,它会向前检查是否符合断言。 Look-behind/look-back的方向是相反的。 JavaScript 不支持look-behind 合规性。且不符合特定断言的称为正/正匹配和负/负匹配名称正则含义Positive Lookahead exp(?=assert) Negative Lookahead exp(?assert) Positive Lookahead exp(?=assert)javascript 不支持负向先行exp(?javascript 不支持"a2*3".replace(/w (?=d)/g,"X");

//X2*3

"a2*34vv".replace(/w(?d)/g,"X");

//aX*3XXX

对象属性

global: 是否全文搜索,默认为falseignore case:是否区分大小写,默认为falsemultiline: 多行搜索,默认值为falselastIndex: 是最后一个字符的下一个位置当前表达式匹配内容的来源:regular 表达式的文本字符串

RegExp.prototype.test(str);

用于测试字符串参数中是否存在与正则表达式模式匹配的字符串。

如果存在则返回true,否则返回false

var reg1=/w/;

reg1.test("a")//true

reg1.test("b")//假

//上述现象与reg1.lastIndex有关

RegExp.prototype.exec(str)

使用正则表达式模式对字符串进行搜索,全局RegExp对象的属性将被更新以反映匹配结果。

如果没有匹配的文本则返回null,否则返回结果数组:

index 声明匹配文本的第一个字符的位置。输入存储检索到的字符串。调用String 时不带g。

调用非全局正则表达式对象的exec() 时,返回一个数组

第一个元素是正则表达式匹配的文本

第二个元素是与RegExpObect 的第一个子表达式匹配的文本(如果有)

第三个元素是与RegExpObject 的第二个子表达式(如果有)匹配的文本,依此类推

var reg3=/d(w)(w)d/;

var ts="$1az2bb3cy4dd5ee";

var ret=reg3.exec(ts);

console.log(reg3.lastIndex+"t"+ret.index+"t"+ret.toString());

//0 1 1az2,a,z

ret=reg3.exec(ts);

console.log(reg3.lastIndex+"t"+ret.index+"t"+ret.toString());

//0 1 1az2,a,z

var reg4=/d(w)(w)d/g;

while(ret=reg4.exec(ts)){

console.log(reg4.lastIndex+"t"+ret.index+"t"+ret.toString());

}

//5 1 1az2,a,z

//11 7 3cy4,c,y

//结论:没有标志g且不代表全局模式的RegExp对象不能使用lastIndex属性。

String.prototype.search(reg)

search() 方法用于检索字符串中指定的子字符串,或者检索与正则表达式匹配的子字符串。

该方法返回第一个匹配结果的索引。如果没有找到,则返回-1;

search 方法不执行全局匹配,它忽略g 标志并始终从字符串的开头进行搜索。

"a1b2c3d1".sarch("1");//1

"a1b2c3d1".sarch(/1/);//1

String.prototype.match(reg)

match() 方法将检索字符串以查找与正则表达式匹配的一个或多个文本

regexp是否带有标志g对结果影响很大

不带g 标志的调用

如果正则表达式没有g 标志,则match() 方法只能在字符串中执行匹配。如果没有找到匹配的文本,则返回null。否则它将返回一个数组,该数组存储它找到的匹配文本。信息返回数组的第一个元素存储匹配的文本,其余元素存储与正则表达式的子表达式匹配的文本。除了常规数组元素外,返回的数组还包含2 个对象属性index 声明匹配文本的起始字符在字符串中的位置

input 声明对stringobject 的引用

var reg3=/d(w)d/;

var reg4=/d(w)d/g;

var ts="$1a2b3c4d5e";

var ret=ts.match(regs3);

控制台.log(ret); //["1a2","a"]

console.log(ret.index+"t"+reg3.lastIndex) //"1 0" 调用了g

如果正则表达式具有g 标志,则match() 方法将执行全局搜索并查找字符串中的所有匹配子字符串。

如果没有找到匹配的字符串,则返回null。如果找到一个或多个匹配的子字符串,则返回一个数组。数组元素存储了字符串中所有匹配的子串,没有索引属性或输入属性。

var reg3=/d(w)d/;

var reg4=/d(w)d/g;

var ts="$1a2b3c4d5e";

var ret=ts.match(regs4);

控制台.log(ret); //["1a2","3c4"]

console.log(ret.index+"t"+reg4.lastIndex); //undefined 0

String.prototype.split()

我们经常使用split方法将字符串分割成字符数组

"a,b,c,d".split(","); //["a","b","c","d"]在一些复杂的分割情况下我们可以使用正则表达式来解决

"a1b2c3d".split(/d/); //["a","b","c","d"]

String.prototype.replace()

String.prototype.replace(str,replaceStr)String.prototype.replace( reg,replaceStr)String.prototype.replace(reg, function)

function参数含义

每次匹配替换时都会调用该函数,该函数有四个参数。

匹配字符串

对内容进行分组的正则表达式。如果没有分组,就没有参数。

字符串中匹配项的索引

原字符串

"a1b2c3d4e5".replace(/d/g,函数(匹配,索引,原点){

返回parseInt(匹配)+1;

}

关于深入掌握正则表达式技巧:进阶学习指南到此分享完毕,希望能帮助到您。

用户评论

半梦半醒i

我一直在研究正则表达式,这玩意儿确实很强大!

    有13位网友表示赞同!

龙卷风卷走爱情

感觉学到这东西以后,对代码能更精细的操作了。

    有7位网友表示赞同!

寒山远黛

分享一下你的学习笔记,我很想看看你总结了什么有趣的点子!

    有12位网友表示赞同!

不要冷战i

哪个地方让我纠结呢?正则表达式总有种让人摸不清头脑的感觉。

    有19位网友表示赞同!

(り。薆情海

学习笔记真棒!这样能帮我系统地学习正则表达式。

    有15位网友表示赞同!

蝶恋花╮

我平时用正则表达式主要是为了爬取网页信息啊,你觉得有什么技巧可以分享吗?

    有8位网友表示赞同!

掉眼泪

感觉这篇笔记针对的是哪个水平的读者呢?适合新手吗?

    有9位网友表示赞同!

軨倾词

正则表达式真的太实用啦,以后学习一下你写的笔记!

    有14位网友表示赞同!

←极§速

我已经开始尝试用正则表达式来写代码了,发现很有用!

    有17位网友表示赞同!

苏莫晨

希望笔记里能有更多实际案例,这样更容易理解。

    有11位网友表示赞同!

如梦初醒

分享一下你学到的常用正则表达式吧,我很需要!

    有20位网友表示赞同!

她最好i

学习笔记太棒了,我一直想找个好的资源来系统学习正则表达式。

    有7位网友表示赞同!

情深至命

正则表达式好神奇啊,以前都没接触过,现在很想去尝试一下!

    有10位网友表示赞同!

怪咖

分享的笔记看起来非常详细,我很期待看看里面有哪些内容!

    有12位网友表示赞同!

╭摇划花蜜的午后

你写的笔记应该能够帮助很多和我一样想学习正则表达式的朋友。

    有10位网友表示赞同!

仅有的余温

正则表达式感觉比我之前掌握的编程语言还要复杂啊,需要好好学习一学习了!

    有8位网友表示赞同!

不离我

笔记分享太棒了!希望能学到一些新的知识和技巧!

    有18位网友表示赞同!

迷路的男人

你写笔记的速度也太快了吧,我一直还在找好资料呢!

    有6位网友表示赞同!

【深入掌握正则表达式技巧:进阶学习指南】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活