(function(str)
{
var result = /\s+(?!.*\s+)/.exec(str);
return ((result)? result.index : -1);
})(txt);
сломан.Он будет соответствовать " \n"
, поскольку .
не соответствует всем пробелам.В частности, он не соответствует пробелам "\r\n\u2028\u2029"
, которые соответствуют \s
.
Если вы хотите найти хороший способ сопоставления с последней (самой большой) группой пробелов в txt
, используйте RegExp
ниже с String.prototype.search
:
var indexOfStartOfLastWhitespaceGroup = str.search(/\s+\S*$/);
Чтобы получить конечный индекс, вы не можете использовать свойство .lastIndex
регулярного выражения, поскольку оно включает в себя часть \S*
.Вы можете снова использовать .search
.
if (indexOfStartOfLastWhitespaceGroup >= 0) {
var indexOfEndOfLastWhitespaceGroup = str.search(/\S*$/);
...
}
Я думаю, какая из следующих двух функций, которые ищут последнюю (самую большую) группу пробелов в txt, работают быстрее (или они имеют незначительный запускразница во времени)
Для небольших строк результат, вероятно, незначителен независимо от того, какой (правильный) метод вы используете.Для больших строк итерация по всей строке будет дорогой, поэтому лучше всего использовать регулярное выражение, которое привязано в конце, то есть имеет $
в качестве последнего токена и не имеет ^
в нем,Интерпретатор может тратить время на поиск по всей строке, когда есть регулярное регулярное выражение, привязанное только к праву, но я полагаю, что большинство делает эту простую оптимизацию.
Это то, что я получаю на shellfree 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, но верно в интерпретаторах большинства других браузеров (не уверен в IE 7 +).