看完你就会正则表达式了
出场为了匹配规定模式的文本 好用的正则表达式可视化工具: https://regexper.com/ 语法//字面量 var regExp1 = /pattern/flags; //或用构造函数 var regExp2 = new RegExp(pattern[,flags]);
一颗超简单的栗子: var regExp = /abc/; "abcdefg".replace(regExp,"WOW"); // "WOWdefg" 常用特殊字符1.字符集合
2.预定义模式预定义模式就是某些常用模式的简写。
3.需要转义的字符正则模式中,需要用斜杠转义的: * + ? $ ^ . | ( ) { } [ ] 需要特别注意的是,如果使用RegExp方法生成正则对象,转义需要使用两个斜杠,因为字符串内部会先转义一次。 4.边界
举个栗子说 b 和 B : "You are smart,but she is smarter.".replace(/smartb/,"kind"); //"You are kind,but she is smarter." "You are smart,but she is smarter.".replace(/smartB/,"kind"); //"You are smart,but she is kinder." if(看不懂){ 就置几动手试试吧 (? ??_??)? } 5.数量词
6.贪婪与懒惰(非贪婪)默认是贪婪模式匹配,即匹配尽可能多的字符。 var regExp1 = /d{3,6}/; "1234567890".replace(regExp1,"X"); //"X7890" 若想手动开启懒惰模式,需要在模式后加 var regExp1 = /d{3,6}?/; "1234567890".replace(regExp1,"X"); //"X4567890" 7.分组与反向引用分组又叫“子表达式”,把完整的正则表达式分成一个个小组,然后反过来用“组号”去引用这些小组就叫“反向引用”。 用例子来说: //无分组 var regExp1 = /abc{2}/; //这样量词{2}只能匹配到c一个字符 //分组 var regExp2 = /(abc){2}/; //这样量词{2}就可以匹配到abc三个字符啦 //同时 abc 也有了一个组号 $1 再看一个栗子: var reg = /(d{1}).*(d{2}).*(d{3})/; "1sss23sss456".replace(reg,"$1?$2?$3"); //"1?23?456" 上面的栗子换一种使用分组的方式: var reg = /(d{1}).*(d{2}).*(d{3})/; var result = reg.exec("1sss23sss456"); console.log(result[1]+"-"+result[2]+"-"+result[3]); //"1-23-456" 组匹配非常有用,下面是一个匹配网页标签的例子: var tagName = /<([^>]+)>[^<]*</1>/; // 1 就是第一个组匹配的内容 tagName.exec("<b>bold</b>")[1] 上面代码稍加修改,就可以捕获带有属性的标签: var html = '<b class="hello">Hello</b><i>world</i>'; var tag = /<(w+)([^>]*)>(.*?)</1>/g; var match = tag.exec(html); match[1] // "b" match[2] // " class="hello"" match[3] // "Hello" match = tag.exec(html); match[1] // "i" match[2] // "" match[3] // "world" 非捕获组: 常用方法正则对象的方法1.RegExp.prototype.test()测试当前正则是否能匹配目标字符串,返回布尔值。 var reg = /d{2}/; var str = "1sss23sss456"; reg.test(str); //true 2.RegExp.prototype.exec()在目标字符串中执行一次正则匹配操作,返回匹配的子字符串。 var reg = /d{2}/; var str = "1sss23sss456"; var result = reg.exec(str); result[0]; //23 result.index; //4 result.input; //"1sss23sss456" 3.RegExp.prototype.toString()返回一个字符串,其值为该正则对象的字面量形式。覆盖了Object.prototype.toString() 方法。 var reg = /d{2}/; reg.toString(); // "/d{2}/" 字符串对象的方法1. str.replace()返回替换后的值 var reg = /d{2}/; var str = "1sss23sss456"; str.replace(reg,"?"); //"1sss?sss456" 常用于消除首尾空格: var str = ' abc def ggg '; str.replace(/^s+|s+$/g,''); // 'abc def ggg'
> $& 指代匹配的子字符串。 > $` 指代匹配结果前面的文本。 > $' 指代匹配结果后面的文本。 > $n 指代匹配成功的第n组内容,n是从1开始的自然数。 > $$ 指代美元符号$。
var prices = { 'pr_1': '$1.99','pr_2': '$7.99','pr_3': '$9.99',}; var template = '<span id="pr_1"></span><span id="pr_2"></span>'; template.replace( /(<span id=")(.*?)(">)(</span>)/,function(match,p1,p2,p3,p4) { return p1 + p2 + p3 + prices[p2] + p4; }); //<span id="pr_1">$1.99</span><span id="pr_2"></span> 注意:第二个分组要加 2.match()与 var reg = /d{2}/; var str = "1sss23sss456"; str.match(reg); //["23"] 与 var reg = /d{2}/g; var str = "1sss23sss456"; reg.exec(str); //["23"] str.match(reg); //["23","45"] 3.search()返回匹配的首字符的位置。 var reg = /d{2}/; var str = "1sss23sss456"; str.search(reg); //4 4.split()返回分割后的数组。 var reg = /d{2}/; var str = "1sss23sss456"; str.split(reg); //["1sss","sss","6"] 小练习
————答案:
应用1.使用正则改变数据结构var re = /(w+)s(w+)/; var str = "John Smith"; var newstr = str.replace(re,"$2,$1"); console.log(newstr); //Smith,John 2.在多行中使用正则表达式var s = "Please yesnmake my day!"; s.match(/yes.*day/); // null s.match(/yes[^]*day/); //'yesnmake my day' 3.从URL中提取子域名var url = "http://xxx.domain.com"; console.log(/[^.]+/.exec(url)[0]); // "http://xxx" console.log(/[^.]+/.exec(url)[0].substr(7)); // "xxx" 匹配除了.之外的任意元素,一到多个字符。 “不会应用等于没有学会”,热烈欢迎小伙伴们在评论区补充平时用到正则表达式的地方,然后我会添加在文章里,一起收集吧 ヽ(??ω?? )ゝ参考: 1.正则表达式学习笔记 2.MDN RegExp文档 3.实战JS正则表达式 4.正则表达式30分钟入门教程 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |