介绍
正则表达式在编程中得到广泛的使用,我们可以很方便的通过正则表达式筛选匹配出我们所需要的内容,进而对这些内容进行修改和替换。相比于静态文本匹配,使用正则表达式能带来更多的灵活性,适用的场景也更多。
JS引擎中处理正则使用的是NFA自动机,其特点是执行慢,但是编译快,适合JS这种动态解释型语言,使用过程中要注意正则匹配过程中的回溯,容易造成性能问题。
1 | reg: /te{1,3}st/g |
首先,正则的第一个字符,会与字符串的第一个字符比对,匹配后指针后移到第二个字符e,匹配后,继续后移遇到{1,3}操作符,因为正则匹配是贪婪模式,这时字符串指针会继续后移,遇到第二个e,指针继续后移,发现s和正则e不匹,这时发生回溯,字符串和正则指针回到前一个状态,接着正则指针指向下一个字符s,字符串指针指向下一个字符s,匹配成功,然后继续后移,t也匹配成功,最终完成整个正则匹配过程,匹配结果为teest。从上面可以看出,回溯等于是把之前的操作推倒重来,在设计正则规则的时候需要尽量减少发生回溯的可能。
用法
我们使用正则的时候先定义匹配规则,生成匹配规则有两种形式,分别是字面量和构造函数的方式,然后还可以加上正则的flag值,分别是g表示全局搜索,i表示忽略大小写,m表示多行搜索
1 | const reg = /abc/gi |
正则中还使用了一些特殊字符,常用的有:
1 | \ 转义字符 |
与此相关的正则表达式方法有
1 | exec |
示例
将数字表示成千位分隔
1 | const reg = /(?<!\.\d+)\B(?=(?:\d{3})+\b)/g //123456789->123,456,789,12345.6789->12,345.6789 |