文字
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;
}
关于深入掌握正则表达式技巧:进阶学习指南到此分享完毕,希望能帮助到您。
【深入掌握正则表达式技巧:进阶学习指南】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
我一直在研究正则表达式,这玩意儿确实很强大!
有13位网友表示赞同!
感觉学到这东西以后,对代码能更精细的操作了。
有7位网友表示赞同!
分享一下你的学习笔记,我很想看看你总结了什么有趣的点子!
有12位网友表示赞同!
哪个地方让我纠结呢?正则表达式总有种让人摸不清头脑的感觉。
有19位网友表示赞同!
学习笔记真棒!这样能帮我系统地学习正则表达式。
有15位网友表示赞同!
我平时用正则表达式主要是为了爬取网页信息啊,你觉得有什么技巧可以分享吗?
有8位网友表示赞同!
感觉这篇笔记针对的是哪个水平的读者呢?适合新手吗?
有9位网友表示赞同!
正则表达式真的太实用啦,以后学习一下你写的笔记!
有14位网友表示赞同!
我已经开始尝试用正则表达式来写代码了,发现很有用!
有17位网友表示赞同!
希望笔记里能有更多实际案例,这样更容易理解。
有11位网友表示赞同!
分享一下你学到的常用正则表达式吧,我很需要!
有20位网友表示赞同!
学习笔记太棒了,我一直想找个好的资源来系统学习正则表达式。
有7位网友表示赞同!
正则表达式好神奇啊,以前都没接触过,现在很想去尝试一下!
有10位网友表示赞同!
分享的笔记看起来非常详细,我很期待看看里面有哪些内容!
有12位网友表示赞同!
你写的笔记应该能够帮助很多和我一样想学习正则表达式的朋友。
有10位网友表示赞同!
正则表达式感觉比我之前掌握的编程语言还要复杂啊,需要好好学习一学习了!
有8位网友表示赞同!
笔记分享太棒了!希望能学到一些新的知识和技巧!
有18位网友表示赞同!
你写笔记的速度也太快了吧,我一直还在找好资料呢!
有6位网友表示赞同!