使用场景:在当前目录下查找所有的TXT文件:find ./ -name *.txt

一个比较好的在线正则表达式可视化网站可以将正则表达式图形化表示出来,我们也可以找到它在github上的地址将其安装到本地。还有一个比较酷的网站

贪婪模式和非贪婪模式

正则表达式默认是贪婪模式,也就是说:尽可能多地匹配。例如:

1
2
var str = '123456789'
str.replace(/\d{3,6}/,'X') // 'X789'

上面的正则可以匹配3,4,5,6个数字,但是会默认匹配6个数字。如果想要尽可能少匹配加上量词?即可:

1
str.replace(/\d{3,6}?/,'X') // 'X456789'

分组

匹配一个小写字母加上一个数字连续出现3次的场景:

1
2
var str = 'a1b2c3d4'
str.replace(/(\w\d){3}/,'X') // 'Xd4'

反向引用和分组捕获

例如将2015-12-25替换为12/25/2015:

1
'2015-12-25'.replace(/(\d{4})-(\d{2})-(\d{2})/,'$2/$3/$1')

lastIndex属性

RegExp.prototype.test方法每次执行结果会作用到正则表达式本身的lastIndex属性(当前匹配结果的最后一个字符的下一个字符的索引)。

1
2
3
4
5
6
7
8
var reg = /\w/g
var str = 'ab'
reg.test(str) // true
reg.test(str) // true
reg.test(str) // false
reg.test(str) // true
reg.test(str) // true
reg.test(str) // false

上面的结果很奇怪,实际上是lastIndex发生了变化,每次匹配的时候都是从上次匹配停下来的地方开始的,当lastIndexundefined时会被再次重置为0.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
> reg.test(str)
true
> reg.lastIndex
1
> reg.test(str)
true
> reg.lastIndex
2
> reg.test(str)
false
> reg.lastIndex
0
> reg.test(str)
true
> reg.lastIndex
1

这个错误是很隐晦的,例如:

1
2
3
4
5
var reg = /\w/g
reg.test('a') // true
reg.test('a') // false
reg.test('a') // true
reg.test('a') // false

上面的现象很容易让人产生错觉:正则是不可靠的,只有奇数次的执行结果是对的。于是一种所谓的解决方案产生了:/\w/g.test('a'),每次使用的时候实例化一个Rex对象就可以保证正确性了,但是这样做也是有缺点的:另外的性能开销。