使用split根据回车分行

我们经常会拿到一个多行的文本,需要在前端展示。

但是HTML不能识别回车,有的时候需要用split来切分段落,然后将切分后的结果形成数组。那么怎么切分呢?

[b]下面是一段js代码[/b]

var text = ... ;
var res = text.split(/\n/);


这是一段简单的代码,并且的确可以解决问题。但当我们考虑复杂一点儿的情况时,这段就还有改进的余地。

这里“复杂一点儿的情况”主要指操作系统的差别。


(1)在微软的MS-DOS和Windows中,使用“回车CR('\r')”和“换行LF('\n')”两个字符作为换行符;
(2)Windows系统里面,每行结尾是 回车+换行(CR+LF),即“\r\n”;
(3)Unix系统里,每行结尾只有 换行CR,即“\n”;
(4)Mac系统里,每行结尾是 回车CR 即'\r'。


[b]改进1[/b]
所以我们要改进上面的正则表达式,可以改为:

var r = /[\n\r]/;
// \n:换行
// \r:回车


上面的代码会解决所有系统下的问题,但会带来一个windows下切分文字的bug。对于如下的文字:

var text = 'abc\r\ncde';

会被切分成三行,实际上,我们只希望得到两行。

[b]于是有了改进2[/b]

var r = /[\n\r]+/;


这个切分开起来比较完美了,但是它忽略了空行。对于如下的文字:

var text = "abc\r\n\r\nddd";

我们会得到两行,而不是想象中的三行。对于大部分显示,这是可以接受的,但我们还希望得到更好的。

[b]改进3[/b]

var r = /\r\n|\n\r|[\n\r]/;

这里有几点需要注意:
[list]
[*]由于js的正则引擎是NFA的,所以会优先匹配第一个分支,因此当存在分支时,“长”的分支要在前面,否则“短”分支会先被匹配。即,不能写成/[\r\n]|\r\n/;
[*]由于回溯的存在,使用[\r\n]的效率高于分支,所以后一个写成[\r\n],而不是\r|\n;
[*]规则/\n\r/可以去掉,从而使之精简。
[/list]

所以以上可以写成:

var r = /\r\n|[\r\n]/;


[b]补充[/b]
对于不用考虑首末空格的可以考虑使用\s+,效率也较高。
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值