(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中最后(最大)的空格组,哪一个运行更快(或者它们在运行时有可忽略的差异)。
对于小字符串而言,无论你使用哪种(正确的)方法,结果都可能是可以忽略不计的。然而,对于大字符串而言,遍历整个字符串将会非常耗费时间,所以您最好使用正则表达式,该正则表达式以结尾为锚点,即最后一个标记为
$
并且其中没有
^
。当存在仅限右侧的锚定正则表达式时,解释器可能会浪费时间执行完整的字符串搜索,但我相信大多数解释器都会进行这种简单的优化。
这是我在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上为false,在大多数其他浏览器的解释器上为true(不确定IE 7+如何)。
index = result.index
而不是index += result.index
。 - Gumbo