正则表达式vs while循环
在阅读本文后 - 是否有允许正则表达式的JavaScript的String.indexOf()版本?)我想下面两个函数中查找txt
最后一个(最大)空白组的速度更快的功能运行时差异可以忽略不计)
(function(str) { var result = /s+(?!.*s+)/.exec(str); return ((result)? result.index : -1); })(txt);
要么
(function(str) { var regex = /s+/g; var result; var index = -1; while(result = regex.exec(str)) { index = result.index; } return index; })(txt);
简而言之,第一个使用正则表达式来查找没有任何其他空白组遵循的空白组,第二个使用while循环。
任何有关这个问题的帮助非常感谢。
(function(str)
{
var result = /s+(?!.*s+)/.exec(str);
return ((result)? result.index : -1);
})(txt);
被打破。 它会匹配" n"
因为.
不匹配所有空格字符。 具体而言,它与s
匹配的空格字符"rnu2028u2029"
不匹配。
如果您想要一个匹配txt
最后一个(最大)空白组的好方法,请使用下面的RegExp
和String.prototype.search
:
var indexOfStartOfLastWhitespaceGroup = str.search(/s+S*$/);
要获取结束索引,您不能使用正则表达式的.lastIndex
属性,因为它包含S*
部分。 你可以再次使用.search
。
if (indexOfStartOfLastWhitespaceGroup >= 0) {
var indexOfEndOfLastWhitespaceGroup = str.search(/S*$/);
...
}
我想下面两个函数中哪一个查找txt中最后一个(最大)的空白组运行得更快(或者它们的运行时差是否可以忽略不计)
对于小字符串,无论使用什么(正确)方法,结果都可能忽略不计。 对于大字符串,遍历整个字符串将会很昂贵,所以最好的办法是使用一个正则表达式,该表达式被锚定在最后,即$
作为最后一个记号,并且没有^
。 解释器可能会浪费时间进行全字符串搜索,只有右侧锚定的正则表达式,但我相信大多数都会执行此简单优化。
这是我在chrome下的squarefree shell中得到的。
var s = '';
for (var i = 10000; --i >= 0;) s += 'abba';
s += 'foo';
var t0 = Date.now(); for (var i = 100; --i >= 0;) /foo$/.test(s); var t1 = Date.now();
var t2 = Date.now(); for (var i = 100; --i >= 0;) /abbafoo/.test(s); var t3 = Date.now();
[t1 - t0, t3 - t2]
// emits [1, 8]
最后,你应该知道, s
并不总是意味着对所有解释同样的事情。 /s/.test("xA0")
,它测试IE 6上的非/s/.test("xA0")
空间(think
)是否为空格,但在大多数其他浏览器的解释器(对IE 7+不确定)上是否为真。
您可以使用jsPerf来比较不同JavaScript片段的性能。 我已经创建了一个使用你的两个变体,这是我的一个变体:
function(str) {
var parts = str.split(/(?=s+)/);
return parts.length === 1 ? -1 : str.length - parts[parts.length-1].length;
}
它基本上使用预见性断言将匹配位置处的字符串拆分。 如果未找到匹配项,则split
将返回一个只包含一个项目的数组; 否则从字符串的总长度中减去最后一部分的长度以获得最后匹配的索引。
更新我已经调整了一些函数,现在我们已经得到了与之前的基准测试相比完全不同的结果。 现在使用/s+(?!S+s+)/
而不是/s+(?!.*s+)/
的第一个函数似乎是最快的。
上一篇: regex vs while loops