Answers:
这可能是一个常见问题解答。无论如何,换行符(更好的是:换行符)可以是回车符(\r
在旧版Mac上为CR,),\n
换行符(\r\n
在Unices 包括Linux上为LF,)或CR后跟LF(在WinDOS上)。(与另一个答案相反,这与字符编码无关。)
因此,RegExp
匹配所有变体的最有效文字是
/\r?\n|\r/
如果要匹配字符串中的所有换行符,请使用全局匹配,
/\r?\n|\r/g
分别。然后replace
按照其他几个答案中的建议进行操作。(也许你并不想删除换行符,但与其他空格替换它们,例如空格字符,这样的话保持不变。)
\u000a
或\n
,它是换行符;\u000d
或\r
,这是回车;\u2028
,是行分隔符;和\u2029
,一个段落分隔符。但是实际上,您发布的正则表达式在大多数情况下就足够了。
.value
动态设置textarea时,例如HTML不会序列化textarea.value = 'a\u2029b'; textarea.value.charAt(1) == '\u2029'; // true
。但这可能是一个极端的情况-正如我所说,在大多数情况下,您的正则表达式就足够了。
换行符的查找方式因操作系统编码而异。Windows会用\r\n
,但Linux只用\n
而Apple用\r
。
我在JavaScript换行符中发现了这一点:
someText = someText.replace(/(\r\n|\n|\r)/gm, "");
那应该删除所有换行符。
\r\n
和 \n
与 \r
不仅仅是更好/[\n\r]/g
?当然这比它应该的慢,因为它只需要对照两个可能的选项检查每个字符。
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/
注意!它仅修剪字符串的开头和结尾,而不修剪字符串中间的换行符或空格。
您可以\n
在正则表达式中使用换行符和\r
回车符。
var str2 = str.replace(/\n|\r/g, "");
不同的操作系统使用不同的行结尾,\n
并且和混合使用\r
。此正则表达式将全部替换。
/\n|\r/g
被更有效地写作/[\n\r]/g
甚至写作/[\n\r]+/g
。除非绝对需要,否则请避免更改。
最简单的解决方案是:
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]
str = str.replace(/\s+/g, ' ').trim();
PointedEars提供的答案就是我们大多数人需要的一切。但是,按照Mathias Bynens的回答,我进行了Wikipedia之旅,发现了这一点: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`)
});
\R
即“所有”换行。其次-为什么不干脆someString.replace(new RegExp(lineTerminators.join('|')), '');
replace()
针对lineTerminators
字符串中存在的字符串运行。
请尝试以下代码。它适用于所有平台。
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'