谈谈 JavaScript 的正则表达式(2)

捕获括号() 可以分组,受影响的是 match()、split()、replace() 方法。

var string = '010-12345' // 无() var reg1 = /^\d{3}-\d{3,8}$/; // 有() var reg2 = /^(\d{3})-(\d{3,8})$/; // match() console.log(string.match(reg1)); // [ '010-12345', index: 0, input: '010-12345' ] console.log(string.match(reg2)); // [ '010-12345', '010', '12345', index: 0, input: '010-12345' ] // split() console.log(string.split(reg1)); // [ '', '' ] console.log(string.split(reg2)); // [ '', '010', '12345', '' ] // replace() - 注意 $1、$2 的含义 console.log(string.replace(reg1,'替换')); console.log(string.replace(reg2,'$2-$1')); // 12345-010 三、性能问题

首先,实现正则表达式引擎有两种方式:DFA 自动机(Deterministic Final Automata 确定型有穷自动机)和 NFA 自动机(Non deterministic Finite Automaton 不确定型有穷自动机)。

对于这两种自动机,他们有各自的区别,这里并不打算深入将它们的原理。简单地说,DFA 自动机的时间复杂度是线性的,更加简单稳定,但是功能有限。而 NFA 的时间复杂度比较不稳定,有时候很好,有时候不怎么好,好不好取决于你写的正则表达式,但是胜在功能更加强大。

JS 与大多数主流语言的正则引擎选用的都是 NFA。

但需要注意的是,这种正则表达式引擎在进行字符匹配时会发生回溯(backtracking)。而一旦发生回溯,那其消耗的时间就会变得很长,有可能是几分钟,也有可能是几个小时,时间长短取决于回溯的次数和复杂度。

所以,我们更要在平时写正则表达式的时候,更加注重性能,避免回溯机制带来的隐患。我们可以用 https://regex101.com/ 来测试下match 的时间如何。

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/772524220ae99a68bd7e99aeaca02cfc.html