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


441

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

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

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


Ответы:


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/

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


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]


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


15

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

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

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

yourString.trim()

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`)
});

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, ' '));

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 для глобальных и многострочных флагов


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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.