JavaScript 字符串解析:正则与 split 性能对比

作者:性能诊所时间:2026-10-26 12:03:26浏览:68

本文通过面试题场景,对比JavaScript中解析查询字符串的两种方案:正则表达式与字符串split。实测显示,在100万次执行下,正则方案耗时4399ms,优于split方案的6116ms。文章提供完整代码及新浪笔试题解,验证了正则处理此类任务的效率优势。

题目背景与需求

在一次公司面试中,现场需要在30分钟内完成一套试题,其中包含一道关于字符串处理的题目。



题目要求编写一个JavaScript函数,将特定格式的URL字符串参数转换为对应的对象。


例如,给定以下测试用例:


输入字符串 a='?name=zhiyelee&blog=www.tsnrose.com';


期望返回对象 b={‘name':'zhiyelee','blog':'www.tsnrose.com'}。




当时由于时间紧迫,实现存在瑕疵,事后重新思考并总结如下。


这里提出两种实现思路:一是利用正则表达式,二是使用字符串的split函数。



正则表达式方案

第一种方法:使用正则表达式处理


首先考虑使用正则表达式,虽然感觉更具挑战性且代码更简洁,但起初怀疑其效率可能低于直接调用字符串函数,后续将验证这一假设。


该方法的逻辑是:利用正则表达式每次匹配出形如‘key=value'的片段,通过循环提取所有结果。


具体实现代码如下:


正则表达式实现代码:

 
var getNRReg = function(str) {
var res = {};
var reg = /(\w+)=(\w+)/g;
while ((a = reg.exec(str))) {
res[a[1]] = a[2];
} 
return res;
}; 

字符串split方案

第二种方法:使用字符串函数处理


这种思路较为常规,但代码实现相对正则表达式更为繁琐。


具体思路是:首先使用‘&'将原字符串分割为多个子串,每个子串格式如‘key=value',然后对每个子串应用split(‘=')。(此方法未使用正则,当然也可使用正则split(/&|=/))。


具体实现代码如下:


字符串split实现代码:

 
var getNRSplit = function(str) {
var temp, res = {},
i, ret;
str = str.slice(1);
temp = str.split('&');
for (i = 0; i < temp.length; i++) {
ret = temp[i].split('=');
res[ret[0]] = ret[1];
} 
return res;
} 

性能对比与结论

两种方法的效率对比


通常认为正则表达式效率较低,因此最初推测第一种方案效率低于第二种,但实测结果出乎意料:



执行1000000次的耗时情况如下:


getNRReg执行耗时 4399ms


getNRSplit执行耗时 6116ms



完整源代码可查看:jsfiddle,欢迎自行测试。

补充说明:


相关笔试题延伸

最后附上新浪微博2011-06-15在北邮宣讲会前端岗位的一道笔试题:



使用正则表达式完成删除与某个字符相邻且相同的字符,例如“fdaffdaaklfjk”字符串处理之后成为“fdafdakljk”。



我的答案见jsfiddle

作者最新文章