【发布时间】:2011-10-04 21:53:36
【问题描述】:
如何用一个替换多个\n?所以如果用户输入
blah
blahdy blah
blah blah
我希望它最终看起来像。
blah
blahdy blah
blah blah
我知道我可以使用 while() 进行循环,但我更愿意使用正则表达式,因为我相信它更有效。
【问题讨论】:
标签: javascript jquery regex
如何用一个替换多个\n?所以如果用户输入
blah
blahdy blah
blah blah
我希望它最终看起来像。
blah
blahdy blah
blah blah
我知道我可以使用 while() 进行循环,但我更愿意使用正则表达式,因为我相信它更有效。
【问题讨论】:
标签: javascript jquery regex
这对我有用:
string = string.replace(/\n+/g, '\n');
正如其他人所说,它将每次出现的一个或多个连续换行符 (\n+) 替换为一个。
g 实现“全局”替换,这意味着它会替换字符串中的所有匹配项,而不仅仅是第一个匹配项。
编辑:如果您还想考虑其他操作系统的行尾样式(例如,\r\n),您可以进行多步替换:
string = string.replace(/(\r\n)+/g, '\r\n') // for Windows
.replace(/\r+/g, '\r') // for Mac OS 9 and prior
.replace(/\n+/g, '\n'); // for everything else
OR(感谢Renesis 提出这个想法):
string = string.replace(/(\r\n|\r|\n)+/g, '$1');
如果您事先知道要处理的文本类型,那么上面的内容可能有点矫枉过正,因为它会带来明显的性能成本。
【讨论】:
\r\n\r\n\r\n .请注意,一行中没有多个 \n 字符。
.replace(/(\r\n)+/g, '\r\n') 应该是.replace(/(\r\n)+/g, '\n'),这样第二个.replace() 就不需要处理\r。
replace 没有冲突,因为\r\n 行结尾没有重复的\r 字符。 @Dan +1 供您编辑。
只需使用字符类将一个或多个\n 或\r 替换为单个\n:
var newString = oldString.replace(/[\n\r]+/g, "\n");
测试 HTML:
<script>
function process(id) {
var oldString = document.getElementById(id).value;
var newString = oldString.replace(/[\n\r]+/g, "\n");
return newString;
}
</script>
<textarea id="test"></textarea>
<button onclick="alert(process('test'));">Test</button>
请注意:在现代网络和大多数现代应用程序中,单个\n 行结尾被优雅地处理,这就是我在这里使用它作为替换字符串的原因。但是,CR+LF (\r\n) operating systems 上的一些更原始的应用程序将显示所有文本一起运行而没有完整的\r\n,在这种情况下,您可以使用Dan Tao's answer,它提供了一种保留行尾的解决方案,或者以下,它完成了类似的一次通话:
string.replace(/(\r\n|\r|\n)+/g, "$1");
【讨论】:
var blah = "blah\n\nblahdy blah\n\n\n\nblah blah\n";
var squeezed = blah.replace(/\n+/g, "\n");
【讨论】:
\r\n\r\n\r\n。请注意,一行中没有多个 \n 字符。
你可以使用正则表达式
xx.replace(/\n+/g, "\n");
【讨论】:
或者没有 JavaScript 引擎设置有限状态机来运行正则表达式的开销,您可以使用数组来做到这一点:
s = s.split("\n").join("");
【讨论】:
对带有详细示例的空格执行相同操作:Regex to replace multiple spaces with a single space。示例:
var str = "The dog has a long tail, and it is RED!";
str = str.replace(/ {2,}/g,' ');
【讨论】: