Как удалить все разрывы строк из строки

441

У меня есть текст в текстовой области, и я прочитал его, используя атрибут .value.

Теперь я хотел бы удалить все Enterразрывы строк (символ, который появляется при нажатии ) из моего текста, теперь использующего .replace с регулярным выражением, но как я могу указать разрыв строки в регулярном выражении?

Если это невозможно, есть ли другой путь?

Wingblade
источник

Ответы:

502

Это, вероятно, часто задаваемые вопросы. В любом случае, разрывы строк (лучше: переводы строк) могут быть одним из следующих: возврат каретки (CR, \rна старых Mac), перевод строки (LF \n, на Unix, включая Linux) или CR с последующим LF ( \r\nна WinDOS). (В отличие от другого ответа, это не имеет ничего общего с кодировкой символов.)

Следовательно, наиболее эффективный RegExpлитерал для соответствия всем вариантам

/\r?\n|\r/

Если вы хотите сопоставить все новые строки в строке, используйте глобальное совпадение,

/\r?\n|\r/g

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

Заостренные уши
источник
16
Для полноты картины следует отметить, что в Unicode есть четыре разных символа новой строки: \u000aor \n, который является переводом строки; \u000dили \r- возврат каретки; \u2028разделитель строк; и \u2029разделитель абзацев. Однако на практике регулярное выражение, которое вы разместили, является достаточным в большинстве случаев.
Матиас Биненс
4
@MathiasBynens Спасибо, но U + 2028 и U + 2029 явно не представляют собой разрывы строк в HTML (4.01), на котором основаны дерево DOM и текущее значение текстовой области: w3.org/TR/html4/struct/text.html #whitespace
PointedEars
5
@PointedEars Да, но сериализация HTML не происходит при .valueдинамической установке текстовой области , например textarea.value = 'a\u2029b'; textarea.value.charAt(1) == '\u2029'; // true. Но это, вероятно, крайний случай - как я уже сказал, в большинстве случаев достаточно регулярного выражения.
Матиас Биненс
2
@MathiasBynens Поскольку U + 2028 и U + 2029 не представляют собой разрывы строк в HTML (4.01), это назначение не отображает две строки в текстовой области с какой-либо основной реализацией DOM и механизмом компоновки. Так что никто в здравом уме не сделает такого назначения в первую очередь.
PointedEars
1
Мне пришлось избежать обратной косой черты, чтобы это работало для меня, т.е. textIn.replace (/ (\\ r \\ n | \\ n | \\ r) / gm, ""). +1 еще. Спасибо
Crab Bucket
513

То, как вы найдете разрыв строки, зависит от кодировки операционной системы. Windows была бы \r\n, но Linux просто использует, \nа Apple использует \r.

Я нашел это в разрывах строк JavaScript :

someText = someText.replace(/(\r\n|\n|\r)/gm, "");

Это должно удалить все виды разрывов строк.

отшельник
источник
19
Почему имеющие отдельный \r\n и \n и \r лучше , чем просто /[\n\r]/g? Конечно, это медленнее, чем должно быть, так как нужно только проверить каждый символ на соответствие двум возможным вариантам.
Ушел кодирование
2
При синтаксическом анализе возвращенных данных из memcached в node.js использование / [\ n \ r] / g помогло мне. Спасибо Gone Coding! Вариант в ответе забил на это.
Кайл Кутс
111

var str = " \n this is a string \n \n \n"

console.log(str);
console.log(str.trim());

String.trim() удаляет пробелы в начале и конце строк ... включая переводы строк.

const myString = "   \n \n\n Hey! \n I'm a string!!!         \n\n";
const trimmedString = myString.trim();

console.log(trimmedString);
// outputs: "Hey! \n I'm a string!!!"

Вот пример скрипки: http://jsfiddle.net/BLs8u/

НОТА! он обрезает только начало и конец строки, а не разрывы строк или пробелы в середине строки.

RobW
источник
34
Это только удаляет разрывы строк в начале и конце строки. ОП спросил, как удалить ВСЕ разрывы строк.
Ян Уолтер
4
Да, просто добавив в качестве опции.
RobW
1
Работал на то, что мне было нужно - начало и конец строки. Спасибо!
Харлин
47

Вы можете использовать \nв регулярных выражениях для перевода строки и \rвозврата каретки.

var str2 = str.replace(/\n|\r/g, "");

Различные операционные системы используют разные окончания строки, с различными сочетаниями \nи \r. Это регулярное выражение заменит их всех.

Кендалл Фрей
источник
Я думаю, что это заменит только первый случай
Себас
5
/\n|\r/gболее эффективно написано /[\n\r]/gили даже /[\n\r]+/g. Избегайте чередования, если оно вам абсолютно не нужно.
PointedEars
Не уверен, что это жалоба. Он делает то, что я сказал: удалите ВСЕ, что не в этом диапазоне HEX. Какие символы зависят от набора символов, конечно, но этот пост был про ASCII.
Мази
22

Если вы хотите удалить все управляющие символы, включая CR и LF, вы можете использовать это:

myString.replace(/[^\x20-\x7E]/gmi, "")

Это удалит все непечатаемые символы. Это все символы НЕ в пределах ASCII HEX пространства 0x20-0x7E. Не стесняйтесь изменять диапазон HEX по мере необходимости.

мази
источник
2
Это также удалит некоторые национальные символы из языков, отличных от английского ....
smentek 25.10.16
21

Самое простое решение было бы:

let str = '\t\n\r this  \n \t   \r  is \r a   \n test \t  \r \n';
str.replace(/\s+/g, ' ').trim();
console.log(str); // logs: "this is a test"

.replace()с помощью /\s+/gрегулярного выражения заменяет все группы символов пробелов на один пробел во всей строке, то мы.trim() удаляем все лишние пробелы до и после текста.

Считаются пробелами:
[ \f\n\r\t\v​\u00a0\u1680​\u2000​-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]

Freezystem
источник
Круто, но у меня все получилось, переназначая переменную:str = str.replace(/\s+/g, ' ').trim();
Фред К
15
var str = "bar\r\nbaz\nfoo";

str.replace(/[\r\n]/g, '');

>> "barbazfoo"
Гордон Фриман
источник
15

Чтобы удалить символы новой строки, используйте это:

yourString.replace(/\r?\n?/g, '')

Затем вы можете обрезать строку, чтобы удалить начальные и конечные пробелы:

yourString.trim()
Si7ius
источник
6

Ответ, предоставленный PointedEars, - это все, что нужно большинству из нас. Но, следуя ответу Матиаса Биненса, я отправился в путешествие по Википедии и нашел его: https://en.wikipedia.org/wiki/Newline .

Ниже приводится функция, которая реализует все, что вышеупомянутая вики-страница считает «новой строкой» во время этого ответа.

Если что-то не подходит для вашего случая, просто удалите это. Кроме того, если вы ищете производительность, это может быть не так, но для быстрого инструмента, который выполняет работу в любом случае, это должно быть полезно.

// replaces all "new line" characters contained in `someString` with the given `replacementString`
const replaceNewLineChars = ((someString, replacementString = ``) => { // defaults to just removing
  const LF = `\u{000a}`; // Line Feed (\n)
  const VT = `\u{000b}`; // Vertical Tab
  const FF = `\u{000c}`; // Form Feed
  const CR = `\u{000d}`; // Carriage Return (\r)
  const CRLF = `${CR}${LF}`; // (\r\n)
  const NEL = `\u{0085}`; // Next Line
  const LS = `\u{2028}`; // Line Separator
  const PS = `\u{2029}`; // Paragraph Separator
  const lineTerminators = [LF, VT, FF, CR, CRLF, NEL, LS, PS]; // all Unicode `lineTerminators`
  let finalString = someString.normalize(`NFD`); // better safe than sorry? Or is it?
  for (let lineTerminator of lineTerminators) {
    if (finalString.includes(lineTerminator)) { // check if the string contains the current `lineTerminator`
      let regex = new RegExp(lineTerminator.normalize(`NFD`), `gu`); // create the `regex` for the current `lineTerminator`
      finalString = finalString.replace(regex, replacementString); // perform the replacement
    };
  };
  return finalString.normalize(`NFC`); // return the `finalString` (without any Unicode `lineTerminators`)
});
futz.co
источник
3
Во-первых - для людей, которые находят, что это не использует JS - поддержка «большинства» RE-ароматов, то \Rесть «все» переводы строки. Во-вторых - почему бы простоsomeString.replace(new RegExp(lineTerminators.join('|')), '');
SamWhan
@ClasG, вы делаете хорошую мысль. Я думаю, что когда я писал об этом, я думал только replace()о том, lineTerminatorsчто существовало в строке, из соображений производительности.
futz.co
5

Перевод строки в регулярном выражении - это \ n, поэтому ваш скрипт будет

var test = 'this\nis\na\ntest\nwith\newlines';
console.log(test.replace(/\n/g, ' '));
h2ooooooo
источник
5

Я добавляю свой ответ, это просто дополнение к вышеприведенному, так как для меня я попробовал все параметры / n, и он не работал, я увидел, что мой текст идет с сервера с двойной косой чертой, поэтому я использовал это:

var fixedText = yourString.replace(/(\r\n|\n|\r|\\n)/gm, '');
Чая Д
источник
5

ИСПОЛЬЗУЙТЕ ЭТУ ФУНКЦИЮ НИЖЕ И ДЕЛАЙТЕ СВОЮ ЖИЗНЬ ПРОСТО

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

function remove_linebreaks( var message ) {
    return message.replace( /[\r\n]+/gm, "" );
}

В вышеприведенном выражении g и m для глобальных и многострочных флагов

vishu2124
источник
2

Попробуйте следующий код. Работает на всех платформах.

var break_for_winDOS = 'test\r\nwith\r\nline\r\nbreaks';
var break_for_linux = 'test\nwith\nline\nbreaks';
var break_for_older_mac = 'test\rwith\rline\rbreaks';

break_for_winDOS.replace(/(\r?\n|\r)/gm, ' ');
//output
'test with line breaks'

break_for_linux.replace(/(\r?\n|\r)/gm, ' ');
//output
'test with line breaks'

break_for_older_mac.replace(/(\r?\n|\r)/gm, ' ');
// Output
'test with line breaks'
Робсон Морайс Сантос
источник
0

На Mac, просто используйте \nв регулярном выражении, чтобы соответствовать разрывы строк. Таким образом, код будет string.replace(/\n/g, ''): ps: g означает, что соответствует всем, а не только первому.

На окнах это будет \r\n.

kobako
источник