最近状况有些糟糕,健康陪伴了我两年的电脑,硬盘彻底报废,大学里积攒的所有数据全部丢失(怪我没有备份),主板也烧了好几处,导致现在发不出声音。另外,由于为了修电脑,跑动跑西,我竟然错过了携程和滴滴出行的两场校招笔试!唉,祸不单行啊,希望情况能快点好起来,校招季不好熬-_-
什么是正则表达式
开头先来推荐两个正则表达式可视化工具: REGEXPER和RegExr。
再来推荐一个适合用来查询的文档:MSDN正则参考手册.aspx)。
正则表达式(Regular Expression)是我们处理字符串的利器,它主要用来描述匹配字符串的规则,主要来解决字符串的查找和替换两大需求。这里就结合js来总结一下正则表达式的用法。
基本使用
正则表达式包括普通字符(比如a到z之间的字母)和元字符。
而元字符又包含了单字符元字符和多字符元字符。
单字符元字符
以下总结了单字符元字符及其行为。
1 2 3 4 5 6 7 8 9 10 11 12 13
| * + ? ^ $ . [] {} () | \
|
多字符元字符
以下列出了多字符元字符以及他们的行为:
1 2 3 4 5 6 7 8 9 10 11 12
| \b \B \d \D \w \W (模式) (?:模式) (?=断言) (?!断言) \num
|
非打印字符
此外还有一些非打印字符:
优先级
优先级从高到低依次如下:
1 2 3 4 5
| \ (), (?:), (?=), (?!), [] *, +, ?, {n,m} ^, $, / |
|
正向前瞻与负向前瞻
前瞻分为正向前瞻和负向前瞻。
正向前瞻:比如/(?=XXX).*/
,它的作用是对后面要匹配的内容做一个预判断,如果后面的内容是XXX,则此段内容匹配成功,继续向后匹配。
负向前瞻:比如/(?!xxx).*/
,它的作用是对后面要匹配的内容做一个预判断,如果后面的内容是XXX,则此段内容匹配失败,跳过去重新开始匹配。
我们来看一个实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| var reg = /\w+(?=ing)/g; var str = 'cooking eating'; str.match(reg); var reg = /\d(?!px)/g; var myStr = '1pt 2px 3em 4px'; str.match(reg);
|
贪婪与懒惰
正则表达式默认为贪婪模式,即尽可能多的匹配。
如果想使用非贪婪模式,只需要在量词(*,+,?,{n,m})之后加上?
即可。
1 2 3 4 5 6 7 8 9 10 11
| var reg = /\d{3,6}/g; var myStr = '123456789'; str.match(reg); var reg = /\d{3,6}?/g; var myStr = '123456789'; str.match(reg);
|
反向引用
反向引用,即引用捕获组匹配到的引用,它既可以在正则表达式内部进行引用,也可以在正则表达式外部进行引用。
捕获组包括两种:普通捕获组和命名捕获组。
普通捕获组

再看一个案例:
1 2 3 4 5 6 7 8 9 10 11
| var reg = /(\d{4})-(\d{2})-(\d{2})/; var str = '2016-09-20'; var newStr = str.replace(reg, '$1/$2/$3') var reg = /(\d)\d\1\1\1/g; var str = '12111 234 65666'; str.match(reg);
|
命名捕获组

但是,js目前还不支持命名捕获组。
js中使用正则表达式
js中使用RegExp和String两个对象的某些方法都可以使用正则表达式。
RegExp的test()
test方法很简单,看正则表达式与指定字符串是否匹配。返回true或者false。
RegExp的exec()
来看一个实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| var reg = /(\w+)ing\s(\w+)/g; var str = 'eating apple eating orange'; var ret = reg.exec(str); var lastIndex = reg.lastIndex; var ret2 = reg.exec(str); var lastIndex2 = reg.lastIndex; var ret3 = reg.exec(str); var lastIndex3 = reg.lastIndex; var index1 = ret.index; var index2 = ret2.index; var input = ret.input; var ignorCase = reg.ignorCase; var global = reg.global; var multiline = reg.multiline; var source = reg.source;
|
String的方法
String类型也提供了一些可以使用正则表达式的方法,具体如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| var str = 'xu0wen123jiang456789'; var index = str.search(reg); var rets = str.match(reg); var arrs = str.split(reg); var newStr = str.replace(reg, '0');
|
一个案例
1 2 3 4 5 6 7 8 9
| var reg = /\d/g; var str = 'a1b2c3d4'; var newStr = str.replace(reg, (match, index, origin) => { return parseInt(match) + 1; });
|