正则表达式小记
什么是正则表达式正则表达式是用于匹配字符串中字符组合的模式。在 JavaScript中,正则表达式也是对象。 正则表达式存在于大部分的编程语言,就算是在写 在
正则表达式在JavaScript中的实现JavaScript中的语法赘述那些特殊字符的作用并没有什么意义,浪费时间。 关于正则表达式,个人认为以下几个比较重要: 贪婪模式与非贪婪模式P.S. 关于 /.+/ // 贪婪模式 /.+?/ // 非贪婪模式 仅仅拿这样简单的例子来说的话,有点儿扯淡 // 假设有这样的一个字符串 let html = '<p><span>text1</span><span>text2</span></p>' // 现在我们要取出第一个`span`中的文本,于是我们写了这样的正则 html.match(/<span>(.+)</span>/) // 却发现匹配到的竟然是 text1</span><span>text2 // 这是因为 我们括号中写的是 `(.+)` .为匹配任意字符,+则表示匹配一次以上。 // 当规则匹配到了`text1`的时候,还会继续查找下一个,发现`<`也命中了`.`这个规则 // 于是就持续的往后找,知道找到最后一个span,结束本次匹配。 // 但是当我们把正则修改成这样以后: html.match(/<span>(.+?)</span>/) // 这次就能匹配到我们想要的结果了 // `?`的作为是,匹配`0~1`次规则 // 但是如果跟在`*`、`+`之类的表示数量的特殊字符后,含义就会变为匹配尽量少的字符。 // 当正则匹配到了text1后,判断后边的</span>命中了规则,就直接返回结果,不会往后继续匹配。 简单来说就是:
捕获组
捕获组有很多的作用,比如处理一些日期格式的转换。 let date = '2017-11-21' date.replace(/^(d{4})-(d{2})-(d{2})$/,'$2/$3/$1') 又或者可以直接写在正则表达式中作为前边重复项的匹配。 let template = 'hello helloworl' template.match(/(w+) 1/) // => hello hello // 我们可以用它来匹配出month和day数字相同的数据 let dateList = ` 2017-10-10 2017-11-12 2017-12-12 ` dateList.match(/^d{4}-(d{2})-(1)/gm) // => ["2017-10-10","2017-12-12"] 非捕获组我们读取了一个文本文件,里边是一个名单列表 let nameList = ` Brandon Stark Sansa Stark John Snow ` nameList.match(/^w+(?=s?Stark)/gm) // => ["Brandon","Sansa"] 上边的 比如我们想实现一个比较常用的功能,给数组添加千分位: function numberWithCommas (x = 0) { return x.toString().replace(/B(?=(d{3})+(?!d))/g,',') } numberWithCommas(123) // => 123 numberWithCommas(1234) // => 1,234
如何使用正则表达式RegExp对象创建
exec方法执行传入一个字符串,然后对该字符串进行匹配,如果匹配失败则直接返回 let reg = /([a-z])d+/ let str = 'a233' let result = reg.exec(str) // => ['a233','a',...] P.S. 如果正则表达式有 let reg = /([a-z])d+/g let str = 'a233' reg.exec(str) // => ['a233',...] // reg.lastIndex = 4 reg.exec(str) // => null test方法用来检查正则是否能成功匹配该字符串 let reg = /^Hello/ reg.test('Hello World') // => true reg.test('Say Hello') // => false
// 筛选出所有名字为 Niko的数据 let data = [{ name: 'Niko Bellic' },{ name: 'Roman Bellic'}] data.filter(({name}) => /^Niko/.test(name)) // => [{ name: 'Niko Bellic' }] String对象除了 search传入一个正则表达式,并使用该表达式进行匹配; 'Hi Niko'.search(/Niko/) // => 3 'Hi Niko'.search(/Roman/) // => -1 // 如果传入的参数为一个字符串,则会将其转换为`RegExp`对象 'Hello'.search('llo') // => 2 split
然而这个参数也是可以塞进去一个正则表达式的。 '1,2|3'.split(/,||/) // => [1,2,3] // 比如我们要将一个日期时间字符串进行分割 let date = '2017-11-21 23:40:56' date.split(/-|s|:/) // 又或者我们有这么一个字符串,要将它正确的分割 let arr = '1,3,4,[5,6,7]' arr.split(',') // => ["1","2","3","4","[5","6","7]"] 这个结果肯定是不对的。 // 所以我们可以这么写 arr.split(/,(?![,d]+])/) // => ["1","[5,7]"] 该条规则会匹配 match
如果正则没有添加 let html = '<p><span>text1</span><span>text2</span></p>' html.match(/<span>(.+?)</span>/g) // => ["<span>text1</span>","<span>text2</span>"] replace
第一个参数可以是一个字符串 也可以是一个正则表达式,转换规则同上几个方法。 当传入字符串时,会将正则所匹配到的字串替换为该字符串。 'Hi: Jhon'.replace(/Hi:s(w+)/g,'Hi: $1 Snow') // => Hi: Jhon Snow 'price: 1'.replace(/price:s(d)/g,(/* 匹配的完整串 */str,/* 捕获组 */ $1) => `price: ${$1 *= 10}`) // => price: 10 一些全新的特性前段时间看了下 Lookbehind assertions(应该可以叫做
|