Як видалити всі розриви рядків з рядка


440

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

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

Якщо це неможливо, чи є інший спосіб?


Відповіді:


501

Це, мабуть, FAQ. Так чи інакше, перерви рядків (краще: нові рядки) можуть бути одними з повернення перевезення (CR ,, \rна старих Macs), каналів ліній (LF ,, Unices, \nвключаючи Linux) або CR з наступним LF ( \r\n, на WinDOS). (На відміну від іншої відповіді, це не має нічого спільного з кодуванням символів.)

Тому найефективнішим RegExpбуквеним для всіх варіантів є

/\r?\n|\r/

Якщо ви хочете зіставити всі нові рядки в рядку, використовуйте глобальну відповідність,

/\r?\n|\r/g

відповідно. Потім перейдіть до replaceметоду, як запропоновано в кількох інших відповідях. (Напевно, ви не хочете видаляти нові рядки, але замініть їх іншими пробілами, наприклад символом пробілу, щоб слова залишалися недоторканими.)


16
Для повноти слід зазначити, що в Unicode є чотири різні нові символи рядка: \u000aабо \n, що є каналом рядка; \u000dабо \r, що є поверненням перевезення; \u2028, роздільник ліній; і \u2029, роздільник абзацу. На практиці, опублікованого вами регулярного виразу в більшості випадків достатньо.
Mathias Bynens

4
@MathiasBynens Дякую, але U + 2028 та U + 2029 явно не складають розривів рядків у HTML (4.01), на основі яких DOM дерево та живе значення textarea базуються на: w3.org/TR/html4/struct/text.html #whitespace
PointedEars

5
@PointedEars Так, але серіалізація HTML не відбувається при .valueдинамічному налаштуванні текстової області , наприклад textarea.value = 'a\u2029b'; textarea.value.charAt(1) == '\u2029'; // true. Але це, мабуть, кращий випадок - як я вже сказав, у більшості випадків ваш регулярний вираз достатній.
Mathias Bynens

2
@MathiasBynens Оскільки U + 2028 та U + 2029 не складають розривів рядків у HTML (4.01), це призначення не відображає двох рядків у текстовій області з будь-яким головним механізмом реалізації та компонування DOM. Тож ніхто з розумним розумом не зробив би таке завдання в першу чергу.
PointedEars

1
Мені довелося уникнути зворотної косої риси, щоб це працювало для мене, тобто textIn.replace (/ (\\ r \\ n | \\ n | \\ r) / gm, ""). Ще +1. Дякую
Крабове відро

512

Як ви знайдете розрив рядків, залежить від кодувань операційної системи. Windows була б \r\n, але Linux просто використовує \nта використовує Apple \r.

Я знайшов це в розривах рядків JavaScript :

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

Це повинно усунути всі види розривів рядків.


18
Чому мають окремий \r\n і \n та \r краще , ніж просто /[\n\r]/g? Безумовно, це повільніше, ніж має бути, оскільки для цього потрібно лише перевірити кожен символ на набір двох можливих варіантів.
Пройшов кодування

2
Під час розбору повернених даних із memcached у node.js за допомогою / [\ n \ r] / g зробив для мене трюк. Дякуємо, що пройшло кодування! Варіант у відповіді перекреслив її.
Кайл Коутс

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
Працював над тим, що мені потрібно - початок і кінець струни. Дякую!
Харлін

46

Ви можете використовувати \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

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+/gregexp змінюємо всі групи символів пробілів на один пробіл у цілому рядку, то ми.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 .

Далі йде функція, що випадає, яка реалізує все, що вищевказана сторінка Wiki вважає "новим рядком" на момент цієї відповіді.

Якщо щось не відповідає вашому випадку, просто вийміть його. Крім того, якщо ви шукаєте продуктивність, це може бути не воно, але швидкий інструмент, який виконує цю роботу в будь-якому випадку, це має бути корисним.

// 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

ВИКОРИСТОВУЙТЕ ЦІЙ ФУНКЦІЮ ВИПУСКУ І ЗРОБИТИ СВОЄ ЖИТТЯ ЛЕГКО

Найпростіший підхід - використання регулярних виразів для виявлення та заміни нових рядків у рядку. У цьому випадку ми використовуємо функцію заміни разом із рядком для заміни, яка в нашому випадку є порожньою рядком.

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в regexp, щоб відповідати рядковим розривам. Таким чином, код буде string.replace(/\n/g, ''), ps: g, що слідує, означає відповідати всім, а не лише першому.

На вікнах це буде \r\n.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.