(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