(function(str)
{
var result = /\s+(?!.*\s+)/.exec(str);
return ((result)? result.index : -1);
})(txt);
已损坏。它将匹配" \n"
,因为.
不匹配所有空格字符。具体而言,它与\s
匹配的空格字符"\r\n\u2028\u2029"
不匹配。
如果你想一个好办法,在txt
匹配最后一个(最大的)空白组,请使用以下RegExp
与String.prototype.search
:
var indexOfStartOfLastWhitespaceGroup = str.search(/\s+\S*$/);
要得到结束索引,你不能使用.lastIndex
属性正则表达式,因为它包含\S*
部分。你可以再次使用.search
。
if (indexOfStartOfLastWhitespaceGroup >= 0) {
var indexOfEndOfLastWhitespaceGroup = str.search(/\S*$/);
...
}
我思考这些看起来最后(最大)空白组TXT运行速度以下两个函数(或他们有可以忽略不计的运行时间差)
对于小字符串的结果可能可以忽略不管你使用什么(正确)的方法。对于大字符串,遍历整个字符串将会很昂贵,所以最好的办法是使用一个正则表达式,该表达式在最后停留,即有$
作为最后一个标记,并且没有^
。解释器可能会浪费时间进行全字符串搜索,只有右侧锚定的正则表达式,但我相信大多数都会执行此简单优化。
这是我在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
并不总是意味着对所有解释同样的事情。它测试IE 6上是否为空格(认为
)为空格,但在大多数其他浏览器的解释器(对IE 7+不确定)上是否为真。
您可以随时[尝试两种方法,看看!](http://jsperf.com) – Pointy 2011-06-05 14:41:58
你的第二个功能是错误的。它需要'index = result.index'而不是'index + = result.index'。 – Gumbo 2011-06-05 14:56:46
我的方法总是做最简单的或者最明智的一个,让专家们优化编译器。总体而言,您可以了解哪种方法最快,并且可以使用它,但是您必须检查所有浏览器和整体语言运行时变化,并且始终进行优化,因此现在最快的速度可能是后者中速度最慢的,因此请让专家处理优化,除非你特别有困难。 – Jonathon 2011-06-05 16:04:31