Cách xóa tất cả các ngắt dòng khỏi chuỗi


440

Tôi có một văn bản trong textarea và tôi đọc nó bằng thuộc tính .value.

Bây giờ tôi muốn xóa tất cả các ngắt dòng (ký tự được tạo khi bạn nhấn Enter) khỏi văn bản của tôi bây giờ bằng cách sử dụng .replace với một biểu thức chính quy, nhưng làm cách nào để chỉ ra một ngắt dòng trong biểu thức chính quy?

Nếu điều đó là không thể, có cách nào khác không?


Câu trả lời:


501

Đây có lẽ là một Câu hỏi thường gặp. Dù sao đi nữa, ngắt dòng (tốt hơn: dòng mới) có thể là một trong Trả lại vận chuyển (CR, \rtrên máy Mac cũ), Line Feed (LF \n,, trên Unices bao gồm Linux) hoặc CR theo sau là LF ( \r\n, trên WinDOS). (Trái ngược với câu trả lời khác, điều này không liên quan gì đến mã hóa ký tự.)

Do đó, RegExpnghĩa đen hiệu quả nhất để phù hợp với tất cả các biến thể là

/\r?\n|\r/

Nếu bạn muốn khớp tất cả các dòng mới trong một chuỗi, hãy sử dụng kết hợp toàn cục,

/\r?\n|\r/g

tương ứng. Sau đó tiến hành replacephương pháp như đề xuất trong một số câu trả lời khác. (Có lẽ bạn không muốn xóa các dòng mới, nhưng thay thế chúng bằng các khoảng trắng khác, ví dụ như ký tự khoảng trắng, để các từ vẫn còn nguyên.)


16
Để hoàn thiện, cần lưu ý rằng có bốn ký tự dòng mới khác nhau trong Unicode: \u000ahoặc \n, đó là nguồn cấp dữ liệu dòng; \u000dhoặc \r, đó là một sự trở lại vận chuyển; \u2028, một dấu phân cách dòng; và \u2029, một phân cách đoạn. Trong thực tế, regex bạn đăng là đủ trong hầu hết các trường hợp.
Mathias Bynens

4
@MathiasBynens Cảm ơn, nhưng rõ ràng U + 2028 và U + 2029 không cấu thành ngắt dòng trong HTML (4.01), mà cây DOM và giá trị trực tiếp của textarea dựa trên: w3.org/TR/html4/struct/text.html #whitespace
PointedEars

5
@PointedEars Có, nhưng tuần tự hóa HTML không xảy ra khi cài đặt .valueđộng của textarea , vd textarea.value = 'a\u2029b'; textarea.value.charAt(1) == '\u2029'; // true. Nhưng đây có lẽ là một trường hợp cạnh - như tôi đã nói, trong hầu hết các trường hợp, regex của bạn là đủ.
Mathias Bynens

2
@MathiasBynens Vì U + 2028 và U + 2029 không cấu thành ngắt dòng trong HTML (4.01), phép gán đó không hiển thị hai dòng trong textarea với bất kỳ công cụ bố trí và triển khai DOM chính nào. Vì vậy, không ai trong tâm trí bên phải của họ sẽ thực hiện một nhiệm vụ như vậy ở nơi đầu tiên.
PointedEars

1
Tôi đã phải thoát dấu gạch chéo ngược để làm việc này cho tôi, ví dụ như textIn.replace (/ (\\ r \\ n | \\ n | \\ r) / gm, ""). +1 vẫn còn. Cảm ơn bạn
Crab Buck

511

Cách bạn tìm thấy ngắt dòng khác nhau giữa các bảng mã hệ điều hành. Windows sẽ có \r\n, nhưng Linux chỉ sử dụng \nvà Apple sử dụng \r.

Tôi đã tìm thấy điều này trong các ngắt dòng JavaScript :

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

Điều đó sẽ loại bỏ tất cả các loại ngắt dòng.


18
Tại sao có riêng \r\n \n \r tốt hơn so với chỉ /[\n\r]/g? Chắc chắn điều này chậm hơn mức cần thiết, vì nó chỉ cần kiểm tra từng nhân vật so với tập hợp hai tùy chọn có thể.
Mã hóa đã qua

2
Khi phân tích cú pháp dữ liệu được trả về từ memcached trong node.js bằng cách sử dụng / [\ n \ r] / g đã lừa tôi. Cảm ơn đã mã hóa! Các tùy chọn trong câu trả lời tàn sát nó.
Kyle Coots

111

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

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

String.trim() xóa khoảng trắng từ đầu và cuối chuỗi ... bao gồm cả dòng mới.

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!!!"

Đây là một ví dụ fiddle: http://jsfiddle.net/BLs8u/

GHI CHÚ! nó chỉ cắt phần đầu và phần cuối của chuỗi, không ngắt dòng hoặc khoảng trắng ở giữa chuỗi.


33
Điều này chỉ loại bỏ ngắt dòng từ đầu và cuối chuỗi. OP hỏi làm thế nào để loại bỏ TẤT CẢ các ngắt dòng.
Ian Walter

4
Đúng, chỉ cần thêm như là một tùy chọn.
RobW

1
Làm việc cho những gì tôi cần - bắt đầu và kết thúc chuỗi. Cảm ơn!
Harlin

46

Bạn có thể sử dụng \ntrong một biểu thức chính thức cho dòng mới và \rcho lợi nhuận vận chuyển.

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

Các hệ điều hành khác nhau sử dụng các kết thúc dòng khác nhau, với các hỗn hợp khác nhau \n\r. Regex này sẽ thay thế tất cả.


Tôi nghĩ rằng điều này sẽ chỉ thay thế sự xuất hiện đầu tiên
Sebas

5
/\n|\r/gđược viết hiệu quả hơn /[\n\r]/ghoặc thậm chí /[\n\r]+/g. Tránh xen kẽ trừ khi bạn thực sự cần nó.
PointedEars

Không chắc chắn nếu đây là một khiếu nại. Nó thực hiện những gì tôi đã nói: loại bỏ MỌI THỨ không nằm trong phạm vi HEX đó. Tất nhiên các ký tự phụ thuộc vào tập char, nhưng bài này là về ASCII.
Masi

22

Nếu bạn muốn xóa tất cả các ký tự điều khiển, bao gồm CR và LF, bạn có thể sử dụng:

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

Nó sẽ loại bỏ tất cả các ký tự không in được. Đây là tất cả các ký tự KHÔNG trong không gian ASCII HEX 0x20-0x7E. Hãy thoải mái sửa đổi phạm vi HEX khi cần thiết.


2
Điều đó cũng sẽ loại bỏ một số ký tự quốc gia khỏi các ngôn ngữ khác ngoài tiếng Anh ....
smentek

21

Giải pháp đơn giản nhất sẽ là:

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()với /\s+/gregrec đang thay đổi tất cả các nhóm ký tự khoảng trắng thành một khoảng trắng trong toàn bộ chuỗi, sau đó chúng tôi .trim()sẽ loại bỏ tất cả các khoảng trắng vượt quá trước và sau văn bản.

Được coi là các ký tự khoảng trắng:
[ \f\n\r\t\v​\u00a0\u1680​\u2000​-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]


Tuyệt vời, nhưng tôi làm cho nó hoạt động khi gán lại biến:str = str.replace(/\s+/g, ' ').trim();
Fred K


15

Để loại bỏ ký tự dòng mới, hãy sử dụng:

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

Sau đó, bạn có thể cắt chuỗi của mình để xóa khoảng trắng ở đầu và cuối:

yourString.trim()

6

Câu trả lời được cung cấp bởi PointedEars là tất cả mọi thứ chúng ta cần. Nhưng bằng cách làm theo câu trả lời của Mathias Bynens, tôi đã thực hiện một chuyến đi trên Wikipedia và tìm thấy điều này: https://en.wikipedia.org/wiki/Newline .

Sau đây là chức năng thả xuống thực hiện mọi thứ mà trang Wiki ở trên xem xét "dòng mới" tại thời điểm trả lời này.

Nếu một cái gì đó không phù hợp với trường hợp của bạn, chỉ cần loại bỏ nó. Ngoài ra, nếu bạn đang tìm kiếm hiệu suất thì điều này có thể không phải là nó, nhưng đối với một công cụ nhanh chóng thực hiện công việc trong mọi trường hợp, điều này sẽ hữu ích.

// 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
Đầu tiên - đối với những người tìm thấy điều này không sử dụng JS - hỗ trợ các hương vị RE "nhất" \Rlà "tất cả". Thứ hai - tại sao không đơn giảnsomeString.replace(new RegExp(lineTerminators.join('|')), '');
SamWhan

@ClasG, bạn làm cho một điểm tốt. Tôi nghĩ rằng dòng suy nghĩ của tôi khi tôi viết điều này là chỉ chạy replace()cho lineTerminatorscái tồn tại trong chuỗi vì lý do hiệu suất.
futz.co

5

Một ngắt dòng trong regex là \ n, vì vậy tập lệnh của bạn sẽ là

var test = 'this\nis\na\ntest\nwith\newlines';
console.log(test.replace(/\n/g, ' '));

5

Tôi đang thêm câu trả lời của mình, nó chỉ là một addon ở trên, vì tôi đã thử tất cả các tùy chọn / n và nó không hoạt động, tôi thấy văn bản của tôi đang đến từ máy chủ với dấu gạch chéo kép nên tôi đã sử dụng cách này:

var fixedText = yourString.replace(/(\r\n|\n|\r|\\n)/gm, '');

5

SỬ DỤNG CHỨC NĂNG NÀY DƯỚI ĐÂY VÀ KIẾM ĐƯỢC CUỘC SỐNG CỦA BẠN DỄ DÀNG

Cách tiếp cận đơn giản nhất là sử dụng các biểu thức thông thường để phát hiện và thay thế các dòng mới trong chuỗi. Trong trường hợp này, chúng tôi sử dụng hàm thay thế cùng với chuỗi để thay thế, trong trường hợp của chúng tôi là một chuỗi rỗng.

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

Trong biểu thức trên, g và m dành cho cờ toàn cầu và đa dòng


2

Hãy thử đoạn mã sau. Nó hoạt động trên tất cả các nền tảng.

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

Trên mac, chỉ cần sử dụng \ntrong regrec để khớp dòng. Vì vậy, mã sẽ là string.replace(/\n/g, ''), ps: g theo sau có nghĩa phù hợp với tất cả thay vì chỉ đầu tiên.

Trên cửa sổ, nó sẽ được \r\n.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.