JavaScript: как использовать регулярное выражение для удаления пустых строк из строки?

Мне нужно использовать JavaScript для удаления пустых строк в текстовом поле HTML. Пустые строки могут быть в любом месте элемента textarea. Пустая строка может быть просто возвратом или пробелами плюс возврат.

Я ожидаю решения регулярного выражения для этого. Вот некоторые из них, которые я пробовал, но они не работают и не могу понять, почему:

/^\s*\r?\n/g   

/^\s*\r?\n$/g

Изменить 1

Похоже, что решение (я его немного изменил), предложенное aaronman и m.buettner, работает:

string.replace(/^\s*\n/gm, "") 

Может кто-нибудь сказать, почему мое первое регулярное выражение не работает?

Изменить 2

Прочитав все полезные ответы, я придумал это:

/^[\s\t]*(\r\n|\n|\r)/gm

Будет ли он охватывать все ситуации?

Изменить 3

Это наиболее краткий вариант, охватывающий все пробелы (пробелы, вкладки) и платформы (Linux, Windows, Mac).

/^\s*[\r\n]/gm

Большое спасибо m.buettner!


person curious1    schedule 04.05.2013    source источник
comment
I am expecting a regular expression solution to this. Ешьте здоровую пищу и разместите здесь регулярное выражение, если оно не работает   -  person Ejaz    schedule 04.05.2013
comment
Тег в заголовке: проверить, Без кода: проверить, Неправильное отношение: проверить, Ироничное сообщение благодарности: проверить, Понижение: проверить.   -  person elclanrs    schedule 04.05.2013
comment
Даже если вы новичок на этом сайте, вы можете искать на нем что-то вроде пустых строк регулярного выражения или что-то в этом роде. На примере вы можете увидеть, на что будет дан ответ и за что будет проголосовано прямо с карты... например: stackoverflow.com/questions/3012788/ - это отвечает вашим потребностям   -  person Kai Qing    schedule 04.05.2013
comment
Привет, ребята, я сам попробовал ряд регулярных выражений, но просто не могу это сделать. И я погуглил для этого. Попробуйте мой заголовок в поиске Google и покажите мне, где вы можете найти ответ.   -  person curious1    schedule 04.05.2013
comment
правильно, поэтому обновите свой вопрос кодом, который вы пробовали. мы покажем вам, что вы сделали неправильно. Судя по всему, вы хотите, чтобы мы сделали вашу работу за вас   -  person Kai Qing    schedule 04.05.2013
comment
Я бы сделал это так: 'Line1\n\nLine3'.split(/\r?\n/).filter(Boolean).join('\n')   -  person kalicki2k    schedule 18.02.2020


Ответы (5)


Ваш шаблон кажется правильным, вам просто нужно включить многострочный модификатор m, чтобы ^ и $ также соответствовали началу и концу строки:

/^\s*\n/gm

Без m якоря соответствуют только началу и концу строки.

Обратите внимание, что вы пропускаете окончания строк в стиле UNIX (только \r). В этом случае поможет:

/^\s*[\r\n]/gm

Также обратите внимание, что (в обоих случаях) вам не нужно явно сопоставлять необязательное \r перед \n, потому что об этом позаботится \s*.

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

/^\s*$(?:\r\n?|\n)/gm
person Martin Ender    schedule 04.05.2013
comment
m.buettner, большое спасибо за указание на сценарий Mac. - person curious1; 04.05.2013
comment
m.buettner, я создал новый /^[\s\t]*(\r\n|\n|\r)/gm. Будет ли он охватывать все ситуации? - person curious1; 04.05.2013
comment
@curious1, \s включает все пробелы. Это пробелы, \t, \r и \n. В этом и был смысл использования \s. Поэтому наши паттерны работают точно так же, и да, они оба охватывают все случаи. - person Martin Ender; 04.05.2013
comment
m.buettner, большое спасибо за подробное и кристально ясное объяснение. Лучший. - person curious1; 04.05.2013
comment
Это не удастся, если последняя строка пуста, потому что нет возврата каретки, вероятно, самый распространенный случай. Нужен вопросительный знак. /^\s*[\r\n]?/gm - person Dex; 01.03.2018
comment
@Dex, это не работает. Это удалит начальные пробелы из всех строк. Вам нужно будет вставить $ перед классом символов. Это хороший улов, я отредактирую ответ. - person Martin Ender; 01.03.2018
comment
Строки с \r\n в качестве новой строки не будут работать: "a\r\nb".replace(/^\s*$(?:\r\n?|\n)/gm, '')==="ab" - person man tou; 29.08.2020

Я верю, что это сработает

searchText.replace(/(^[ \t]*\n)/gm, "")
person aaronman    schedule 04.05.2013
comment
Это не позволит использовать \r\n или любой другой пробел перед разрывом строки. - person Martin Ender; 04.05.2013
comment
исправил это, в его исходном сообщении не говорилось, что строка пуста, если в ней есть пробелы - person aaronman; 04.05.2013
comment
aaronman, спасибо за дополнительный код для перехвата \t. ценить это! - person curious1; 04.05.2013

Я думаю, это должно помочь:

var el = document.getElementsByName("nameOfTextBox")[0];
el.value.replace(/(\r\n|\n|\r)/gm, "");

EDIT: удаляет три типа разрывов строк.

person Bjørn Bråthen    schedule 04.05.2013
comment
В основном он хочет удалить символы новой строки - person Ejaz; 04.05.2013
comment
ааа.. пора спать я думаю ;) - person Bjørn Bråthen; 04.05.2013
comment
Это удалит все разрывы строк (а не только пустые строки), а m будет избыточным. - person Martin Ender; 04.05.2013
comment
Бьорн Братен, спасибо, что показал все три типа разрывов строк, что для меня действительно ново. Еще раз спасибо! - person curious1; 04.05.2013
comment
\r\n обычно Windows, \n linux и \r mac, если я правильно помню. - person Bjørn Bråthen; 04.05.2013

Вот другое решение:

string = string.replace(/^(?=\n)$|^\s*|\s*$|\n\n+/gm, "")

Похоже, он обрабатывает как пустые строки, так и строки, содержащие только пробелы.

person Pikamander2    schedule 08.06.2021

function removeEmptyLine(text) {
  return text.replace(/(\r?\n)\s*\1+/g, '$1');
}

контрольная работа:

console.assert(removeEmptyLine('a\r\nb') === 'a\r\nb');
console.assert(removeEmptyLine('a\r\n\r\nb') === 'a\r\nb');
console.assert(removeEmptyLine('a\r\n \r\nb') === 'a\r\nb');
console.assert(removeEmptyLine('a\r\n \r\n  \r\nb') === 'a\r\nb');
console.assert(removeEmptyLine('a\r\n \r\n 2\r\n  \r\nb') === 'a\r\n 2\r\nb');
console.assert(removeEmptyLine('a\nb') === 'a\nb');
console.assert(removeEmptyLine('a\n\nb') === 'a\nb');
console.assert(removeEmptyLine('a\n \nb') === 'a\nb');
console.assert(removeEmptyLine('a\n \n  \nb') === 'a\nb');
console.assert(removeEmptyLine('a\n \n2 \n  \nb') === 'a\n2 \nb');
person man tou    schedule 29.08.2020