2013-07-31 2 views
3

Я пытаюсь обрезать ведущие и завершающие пробелы и символы новой строки из строки. Новые строки написаны как \n (два отдельных символа, косая черта и n). Другими словами, это строковый литерал, а не специальный символ CR LF.Почему это регулярное выражение так медленно?

Например, это:

\n \nRight after this is a perfectly valid newline:\nAnd here is the second line. \n

должны стать это:

Right after this is a perfectly valid newline:\nAnd here is the second line.

Я пришел к этому решению:

text = text 
     .replace(/^(\s*(\\n)*)*/, '') // Beginning 
     .replace(/(\s*(\\n)*)*$/, '') // End 

Эти модели совпадают просто отлично согласно RegexPal.

Однако второй шаблон (соответствующий концу строки) занимает очень много времени — около 32 секунд в Chrome на строке с несколькими параграфами и несколькими конечными пробелами. Первый шаблон довольно быстрый (миллисекунды) в той же строке.

Here is a CodePen to demonstrate it.

Почему это так медленно? Есть ли лучший способ сделать это?

+0

Возможные дублируют [обрезки в JavaScript? что этот код делает?] (http://stackoverflow.com/q/3387088/580951) – Romoku

+0

@Romoku Я согласен, что другой вопрос относится к одной теме, но я ничего не вижу о производительности регулярных выражений. – Pointy

+4

У вас есть огромная возможность, даже вложенная опциональность. Это очень медленно. Сделайте '.replace (/^\ s + /). Replace (/ \ s + $ /)' – Esailija

ответ

7

Причина это занимает так много времени, потому что у вас есть * количественной оценки еще два *

Хорошее объяснение можно найти в PHP manual, но я не думаю, что JavaScript поддерживает один раз только подшаблонами.

Я хотел бы предложить это регулярное выражение вместо:

text = text.replace(/^(?:\s|\\n)+|(?:\s|\\n)+$/g,""); 
+0

Это сделало. Очень быстро, спасибо. См. Кнопку «Обе, намного быстрее» в ручке: http://codepen.io/cpatik/pen/dkmel – craigpatik

-3

Неправильный ответ, но одно обходное решение должно было бы изменить строку, а также изменить \ n на n \ в регулярном выражении (для начала), применить его, а затем отменить строку обратно.

+1

преувеличивание задачи ... действительно – overloading