企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
#### 1. 正则是思维方式 ``` ``` #### 2. 一道面试题 ``` 用 JS 实如下功能: 将给定的数字转化成千分位的格式 如把“10000”转化成“10,000” ``` 90%的人可能是这么思考的 ![](https://raw.githubusercontent.com/lz109896/Web-datum/02a7b789d0a1736e5fd609c3669d0f812f203ff7/%E4%B8%80%E9%81%93%E9%9D%A2%E8%AF%95%E9%A2%98%201.png) 1%的人才能想得到对的方法 ![](https://raw.githubusercontent.com/lz109896/Web-datum/02a7b789d0a1736e5fd609c3669d0f812f203ff7/%E4%B8%80%E9%81%93%E9%9D%A2%E8%AF%95%E9%A2%98%202.png) #### 3. 什么是正则 模式和标志尾 ![](https://raw.githubusercontent.com/lz109896/Web-datum/02a7b789d0a1736e5fd609c3669d0f812f203ff7/%E4%BB%80%E4%B9%88%E6%98%AF%E6%AD%A3%E5%88%99%201.png) ``` 对象字面量 var obj = { hello: true }; 构造函数 var obj = new Object(); obj.hello = true; var reg = new RegExp('(?=(?!\\b)(\\d{3})+$)','g') ``` ![](https://raw.githubusercontent.com/lz109896/Web-datum/02a7b789d0a1736e5fd609c3669d0f812f203ff7/%E4%BB%80%E4%B9%88%E6%98%AF%E6%AD%A3%E5%88%99%202.png) ``` A - Java PHP Python JS 等等都有正则,但语法稍微有点不同。影响其实也不大,你精通了 JS 的正则,其他语言的正则也能很快上手。 B - 既可以 /[abc]/来声明正则,也可以 new RegExp('[abc]') 来声明,一个是字面量,一个是构造函数。 C - 正则一般由 pattern 和 flag 。 ``` #### 4. 基本语法 ![](https://raw.githubusercontent.com/lz109896/Web-datum/02a7b789d0a1736e5fd609c3669d0f812f203ff7/%E5%9F%BA%E6%9C%AC%E8%AF%AD%E6%B3%95%20.png) #### 5. 基本语法实战 ![](https://raw.githubusercontent.com/lz109896/Web-datum/02a7b789d0a1736e5fd609c3669d0f812f203ff7/%E5%9F%BA%E6%9C%AC%E8%AF%AD%E6%B3%95%E5%AE%9E%E6%88%98%20.png) http://coding.imweb.io/demo/p7/regexp-basic.html ``` var remail = /^[0-9a-z\-.]+@[0-9a-z\-.]+$/; var email = 'liaozhou@qq.com'; console.log(remail.test(email)); //console.log(/^\w*s/.test('')); ``` ``` 检测字符串是不是数字开头 var reg = /^[0-9]/; // 正则写在这里 // 下面的变量,其结果都要符合预期 var ret1 = reg.test('i love regular expression'); var ret2 = reg.test('啊哈33哈哈好3'); var ret3 = reg.test('12345wwww'); ``` #### 6. RegExp 对象 ``` var reg = /(\w)/ig; //console.dir(reg);打印对象 //console.log(reg.exec('aaqrea')); //console.log(reg.test('_')); ``` ![](https://raw.githubusercontent.com/lz109896/Web-datum/02a7b789d0a1736e5fd609c3669d0f812f203ff7/RegExp%20%E5%AF%B9%E8%B1%A1%201.png) #### 7. flags http://coding.imweb.io/demo/p7/regexp-obj.html ``` i(ignoreCase) 忽略大小写 g(global) 全局匹配 m(multiline) 多行匹配 ``` ``` var reg = /(\w)/igm; ----igm是标志位 //console.log(reg.ignoreCase);忽略大小写 //console.log(reg.global); //console.log(reg.multiline); //console.log(reg.source); //console.log(/a/i.test('A'));---i是标志位:忽略大小写 //console.log('abnababa'.match(/a/g));---g是标志位,全局匹配a,全部找出 //console.log('ab\nababab'.match(/^a/gm));---- ^:开始符,\n:换行符,全局匹配多行a 开头的,那么length:2 ``` #### 8. 重复(量词) http://coding.imweb.io/demo/p7/regexp-repeat.html ![]https://raw.githubusercontent.com/lz109896/Web-datum/02a7b789d0a1736e5fd609c3669d0f812f203ff7/%E9%87%8D%E5%A4%8D%E9%87%8F%E8%AF%8D.png() #### 9. 重复(量词)实战 ``` var reg = /^https?:\/\/ke\.q{2}\.com\/$/ console.log(reg.test('https://ke.qq.com/')); ^ 和 $ 是开始与结尾的标志符,防止乱七八糟的开头或者结尾 var reg2 = /^https?:\/\/ke\.q{2}\.com\/.+$/; console.log(reg2.test('https://ke.qq.com/index.html')); .+ 表示后面必须有1次及以上的重复 var reg2 = /^https?:\/\/ke\.q{2}\.com\/.*$/; console.log(reg2.test('https://ke.qq.com/')); .* 重复0次或者1次 ``` 手机号码 : var rPhone = /^1\d{10}$/; #### 10. 分组与捕获 ![](https://raw.githubusercontent.com/lz109896/Web-datum/02a7b789d0a1736e5fd609c3669d0f812f203ff7/%E5%88%86%E7%BB%84%E4%B8%8E%E6%8D%95%E8%8E%B7%20.png) ``` 010101 (01){3} 分组 (liao) love (?:coding|girl) | 或者的意思 ``` #### 11. 引用和反向引用 ``` var ret3 = /(liao) love (coding|girl)/.exec('liao love girl'); ----引用 console.log(ret3[1], 'b', RegExp.$2); var reg = /<(div)>.*<\/\1>/;//反向引用 console.log(reg.test('<div>ssfsfsfssf</div>')) ``` ``` 源字符串:abcdebbcde 正则表达式:([ab])\1 对于正则表达式“([ab])\1”,捕获组中的子表达式“[ab]”虽然可以匹配“a”或者“b”,但是捕获组一旦匹配成功,反向引用的内容也就确定了。如果捕获组匹配到“a”,那么反向引用也就只能匹配“a”,同理,如果捕获组匹配到的是“b”,那么反向引用也就只能匹配“b”。由于后面反向引用“\1”的限制,要求必须是两个相同的字符,在这里也就是“aa”或者“bb”才能匹配成功。 考察一下这个正则表达式的匹配过程,在位置0处,由“([ab])”匹配“a”成功,将捕获的内容保存在编号为1的组中,然后把控制权交给“\1”,由于此时捕获组已记录了捕获内容为“a”,“\1”也就确定只有匹配到“a”才能匹配成功,这里显然不满足,“\1”匹配失败,由于没有可供回溯的状态,整个表达式在位置0处匹配失败。 正则引擎向前传动,在位置5之前,“([ab])”一直匹配失败。传动到位置5处时,,“([ab])”匹配到“b”,匹配成功,将捕获的内容保存在编号为1的组中,然后把控制权交给“\1”,由于此时捕获组已记录了捕获内容为“b”,“\1”也就确定只有匹配到“b”才能匹配成功,满足条件,“\1”匹配成功,整个表达式匹配成功,匹配结果为“bb”,匹配开始位置为5,结束位置为7。 扩展一下,正则表达式“([a-z])\1{2}”也就表达连续三个相同的小写字母。 ``` ##### 过滤出年月日 ``` 这就是目标字符串:20130213 ,(年)(月)(日) 这种形式,非常的常见。 现在要把年、月、日分别捕获出来,即实现如下代码效果: reg.exec('20130213') //结果: ['20130213', '2013', '02', '13'] var rDate = /^(\d{4})((?:0|1)?\d)((?:0|1|2|3)?\d)$/; // 正则写在这里 // ^ 和 $ 不多说了 // (\d{4}) 捕获四位数字的年份 // ((?:0|1)?\d) 月份条件 ?:表示非捕获型分组 ? 表示 0 次或者 1 次 // ((?:0|1|2|3)?\d) 和月份差不多 // 下面的变量,其结果都要符合预期 var ret1 = rDate.exec('20130211'); var ret2 = rDate.exec('20133211'); var ret3 = rDate.exec('2013211'); var ret4 = rDate.exec('2013251'); var ret5 = rDate.exec('201321'); ``` #### 12. 贪婪匹配和惰性匹配 http://coding.imweb.io/demo/p7/regexp-greedy-vs-lazy.html ``` 贪婪(greedy)匹配:普通量词 惰性(lazy)匹配:普通量词加? 非贪婪,non-greedy ``` ``` var s ='<span>hello</span><span>world</span>'; var reg = /<span>.+?<\/span>/; console.log(reg.exec(s)); ``` #### 13. 正向前瞻和负向前瞻 正向前瞻(?=) 负向前瞻(?!) ![]() #### 14. 正向前瞻和负向前瞻实战 \s :表示空格 ``` 找出 jero love coding var reg1 = /jero(?=\slove\scoding)/g; var reg2 = /jero(?!\slove\sgirl)/g; var target = 'jero love coding jero love girl jero love coding'; console.log(target.match(reg1)); ``` ``` 找出只要不是:jero love girl var reg1 = /jero(?=\slove\scoding)/g; var reg2 = /jero(?!\slove\sgirl)/g; var target = 'jero love coding jero love girl jero love coding jero love writing'; console.log(target.match(reg2)); ``` ``` 只找到img 和 hello var target = 'img.jpg style.css script.js hello.jpg' var reg = /\b(\w+)(?=\.jpg)\b/g; console.log(target.match(reg)) ``` #### 15. String 对象 ``` String ``` #### 16. 解题 ``` ```