JavaScript正则expression式缓慢与特殊字符

我花了两天的时间想弄清楚一些事情,如果有人能向我解释,我真的很感激。

编辑:我终于明白,这个问题不是因为下面的代码,而是来自一个库,我用来加载正则expression式,包xlsx。 如果我用另一种方式加载正则expression式,问题不会发生。


这个问题现在已经过时了,我把它作为参考。 我将分别发布特定于xlsx pakcage的问题

我有一个对象(约150K)的数组:

[ {regexp: 'something (either|or) anything', res: 'result is: $1'}, {regexp: 'or something more complexe ....', res: '...'}, ... ] 

每个对象都包含两个属性:1. regexp:正则expression式来search2. res:要replace的文本

例如,可能是:

  1. 这是(好的)消息
  2. 结果是:$ 1

我用这个数组是这样的:提供一个inputstring,对于每个obj,我做一个replacestring

 function doSomethingOn(text) { regexpObjs.forEach(regexpObj => { text = text.replace(regexpObj.regexp, regexpObj.regexpRes); }); return text; }); 

我注意到,我第一次运行doSomethingOn为一个string,这将需要“很长一段时间”。 我想这是运行时编译和caching正则expression式的时间。 然后任何进一步调用doSomethingOn与相同的string,或任何其他string将更快

我的问题和问题如下: – 如果现在作为一个inputstring,我使用一个特殊字符的string,如',“,»或«,等等…第一次将需要很长时间。

更糟糕的是,在某些情况下,下次运行doSomethingOn时,任何string都会崩溃,并显示“致命错误:CALL_AND_RETRY_LAST分配失败 – JavaScript堆内存不足”

问题1:为什么第一次用特殊字符的string执行时间很长

问题2:在特殊的string调用之后,什么可能会使其崩溃

作为补充,下面是一个以150毫秒的相对复杂的正则expression式在一次运行中以毫秒计时的例子:

  1. 时间与string1 = 6017ms
  2. 时间与string1 = 184毫秒
  3. 时间与string2 = 178毫秒
  4. 时间与特殊string1 = 4040ms
  5. 时间与特殊string1 = 282ms
  6. 时间与string1 = 180毫秒
  7. 时间与string2 = 182ms