但是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+,效率也较高。