обрезать в javascript? что делает этот код?

Я искал функцию обрезки в JavaScript, которой не существует, и некоторый код в Google предлагает использовать:

function trimStr(str) {
  return str.replace(/^\s+|\s+$/g, '');
}

Я хочу знать, как работает str.replace(/^\s+|\s+$/g, ''). Я понимаю, что это какая-то форма регулярного выражения, но не знаю, что оно делает.


person sushil bharwani    schedule 02.08.2010    source источник


Ответы (2)


/^\s+|\s+$/g ищет пробелы либо в начале, либо в конце строки. Выражение можно разделить на две части, ^\s+ и \s+$, разделенные знаком | (ИЛИ). Первая часть начинается с начала строки (^) и включает столько пробельных символов, сколько возможно (\s+). Вторая часть делает то же самое, но в обратном порядке и в конце со знаком доллара ($).

На простом английском регулярное выражение будет выглядеть так:

Найдите как можно больше пробелов с начала строки или как можно больше пробелов с конца.

Обратите внимание, что \s соответствует пробелам, символам табуляции и разрывам строк.

Часть /g в конце обеспечивает глобальный поиск, который допускает множественные замены (например, не только начало, но и конец строки).

person Tatu Ulmanen    schedule 02.08.2010
comment
получил все, кроме /g. Не могли бы вы дать больше объяснений, что есть еще примеры - person sushil bharwani; 02.08.2010
comment
меня смущает /g часть в конце, включает глобальный поиск, зачем он нам нужен здесь. Поскольку мы уже включили условие для начала и конца строки - person sushil bharwani; 02.08.2010
comment
@suhil, здесь глобальный флаг означает, что может быть более одной замены. Без него он заменит только первый матч. Например. " foo ".replace(/^\s+|\s+$/, "") (не глобально) равно "foo " - person Matthew Flaschen; 02.08.2010

^ — это начало строки, а $ — конец. \s означает символ пробела (который в JavaScript конкретно означает табуляцию, вертикальную табуляцию, перевод формы, пробел, неразрывный пробел, знак порядка байтов, разделитель пробелов Unicode (категория Zs), перевод строки, возврат каретки, разделитель строк или разделитель абзацев ), а + означает 1 или более. | — это чередование, выбор между двумя возможностями. g — глобальный флаг. Таким образом, регулярное выражение означает начало, затем один или несколько пробелов или один или несколько пробелов, а затем конец. Затем мы заменяем все совпадения (поскольку они глобальные) пустой строкой.

Вас может заинтересовать этот сообщение в блоге, в котором анализируется более подробно, чем вы наверное нужно :) плюсы и минусы различных функций отделки.

person Matthew Flaschen    schedule 02.08.2010
comment
\s означает больше, чем пробел (это означает пробел). В JS он включает символы [ \r\n\t]. - person Andy E; 02.08.2010
comment
@Энди, спасибо, я действительно знал об этом, но не очень хорошо выразился. Я не хотел сказать, что это просто ASCII 0x20 (настоящее пространство). я уточнил; на самом деле это на несколько символов больше, чем вы сказали. - person Matthew Flaschen; 02.08.2010
comment
хорошо сделано для дальнейшего разъяснения, я просто включил персонажей, в которых был полностью уверен. Однако вы должны знать, что \s указывается только для соответствия спецификации 5-го издания ECMA-262 (оно не было включено в 3-е издание). Кроме того, в Internet Explorer до версии 8 точные символы, соответствующие \s, эквивалентны [ \f\n\r\t\v], поэтому ваш список не является идеальным справочником для полной совместимости между браузерами. - person Andy E; 02.08.2010
comment
@ Энди, да, я заметил, что спецификация помечена в приложении E как дополнение. Спасибо за замечание по поводу IE. Поскольку ошибки браузера идут, это довольно незначительно. Сколько людей вводят неразрывный пробел или разделитель строк в текстовое поле? Если это важно, фильтрация в любом случае должна выполняться на стороне сервера. - person Matthew Flaschen; 02.08.2010
comment
согласованный. Такие вещи обычно происходят только во время копирования/вставки. - person Andy E; 02.08.2010