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

299

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

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

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

Теги:
string

12 ответов

348
Лучший ответ

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

Поэтому наиболее эффективным RegExp литералом для соответствия всем вариантам является

/\r?\n|\r/

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

/\r?\n|\r/g

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

  • 12
    Для полноты картины следует отметить, что в Unicode есть четыре разных символа новой строки: \u000a или \n , что является переводом строки; \u000d или \r , который является возвратом каретки; \u2028 , разделитель строк; и \u2029 , разделитель абзацев. Однако на практике регулярное выражение, которое вы разместили, в большинстве случаев достаточно.
  • 4
    @MathiasBynens Спасибо, но U + 2028 и U + 2029 явно не представляют собой разрывы строк в HTML (4.01), на которых основаны дерево DOM и текущее значение текстовой области: w3.org/TR/html4/struct/text.html #whitespace
Показать ещё 4 комментария
377

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

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

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

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

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

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/

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

  • 26
    Это только удаляет разрывы строк в начале и конце строки. ОП спросил, как удалить ВСЕ разрывы строк.
  • 3
    Да, просто добавив в качестве опции.
31

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

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

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

  • 0
    Я думаю, что это заменит только первый случай
  • 4
    /\n|\r/g написано более эффективно /[\n\r]/g или даже /[\n\r]+/g . Избегайте чередования, если оно вам абсолютно не нужно.
Показать ещё 1 комментарий
20

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

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

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

  • 2
    Это также удалит некоторые национальные символы из языков, отличных от английского ....
14
var str = "bar\r\nbaz\nfoo";

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

>> "barbazfoo"
11

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

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

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

yourString.trim()
10

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

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 regexp меняет все группы символов пробелов на единое пространство во всей строке, тогда мы .trim() результат, чтобы удалить все лишние пробелы до и после текста.

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

5

Ответ, предоставленный 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')
});
  • 2
    Во-первых - для людей, которые находят, что это не использует JS - «большинство» вкусов RE поддерживают \R что означает «все» переводы строки. Во-вторых, почему бы не просто someString.replace(new RegExp(lineTerminators.join('|')), '');
  • 0
    @ClasG, вы делаете хорошую мысль. Я думаю, что когда я писал это, я думал о том, чтобы запускать replace() для lineTerminators которые существовали в строке по соображениям производительности.
5

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

var test = 'this\nis\na\ntest\nwith\newlines';
console.log(test.replace(/\n/g, ' '));
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'
-1

Другой прием, если вы хотите получить числа, это использовать parseFloat() или parseInt(), и он вернет вам хороший номер.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню