【发布时间】:2022-10-13 19:16:18
【问题描述】:
const str = 'i love code. i write code everyday.'
const regex = /code/g
const outputJs = str.replace(regex, 'js' )
const outputCss = str.replace(regex, 'css' )
const outputHtml = str.replace(regex, 'html')
在这里,我搜索/code/g 三次并替换为不同的字符串。
有没有办法优化这段代码?
因为如果正则表达式变得复杂并且 str 很长,那么 javascript 引擎将需要一些时间来一次又一次地搜索相同的内容,以替换为不同的单词。
我希望你明白我想要做什么。
编辑:一种解决方法是:
- 使用 regex.exec(str) 和一些字符串操作生成一组模板字符串。
- 使用这些模板字符串通过在它们之间连接替换字符串来生成输出。
【问题讨论】:
-
您需要 3 个单独的替换件。没有太多的办法。
-
@TimBiegeleisen 这不是真的,理论上你可以使用
regex.exec()然后用它返回的索引替换,但不确定它是否值得。 -
@PoulBak 我知道,但是如果您正确计算长度,您仍然可以使用
regex.exec()。 -
@AvisekDas 是的,你是对的。您需要跟踪偏移量,但它可能比多次运行正则表达式更快。只要确保它实际上是值得的。
-
@AvisekDas 在这种情况下,您需要创建一个数组
['i love ', null, '. i write ', null, ' everyday.'],然后在每一帧中将占位符元素和.join('')分配给一个字符串。您也可以尝试编译为函数 (new Function('t0', 't1', 'return `'i love ${t0}. i write ${t1} everyday.`;')),但我怀疑这会发生很大变化。
标签: javascript regex performance optimization replace