如何优化JavaScript中匹配特定数字的正则表达式?
问题描述
需要检测字符串是否包含特定数字序列,数字之间可夹杂任意非数字字符。本文中,number指连续数字序列(如123),digit指单个数字元素(如0、1、2)。
示例字符串需能检测出数字012345:
abc 012345 def abc 0.1.2.3.4.5 def abc 0-1 2a3x4,,,5 def
特性说明
- a) 需匹配的是指定的特定数字序列,而非任意数字。
- b) 数字间的分隔字符类型未知、长度不定,但99%的场景下分隔字符长度不超过10。
- c) 待检测的字符串99%情况下长度小于100字符。
运行环境为JavaScript Node.js,现有代码如下:
// 遍历每个正则表达式 for (const regex of regexes) { if (new RegExp(regex, 'iu').test(text)) { // ... } }
当前使用的最简易但效率极低的正则表达式会占用大量计算时间:
const regexes = [ '0.*1.*2.*3.*4.*5', '1.*1.*2.*2.*3.*3' ];
请问是否可对正则表达式或JavaScript代码进行优化?
性能对比
以下是来自评论及回答的优化方案的执行时间对比,按从快到慢排序:
- 使用
str.replace(/\D/g, '')移除非数字字符,再用正则012345匹配,此方案最快;虽非纯正则优化,但符合代码优化的要求(感谢@anubhava) - 使用否定字符类
0\D*1\D*2\D*3\D*4\D*5,仅比方案1慢约4%,且无需额外JS代码,是最佳纯正则优化方案(感谢@WiktorStribiżew) - 在真实文本数据中,贪婪匹配
1.*2.*3.*4.*5及限制范围的1.{0,10}2.{0,10}3.{0,10}4.{0,10}5变体,比方案1慢约50%-90%
内容的提问来源于stack exchange,提问作者Manuel
相关产品推荐
相关产品推荐

