`

使用split根据回车分行

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

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

下面是一段js代码
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'。


改进1
所以我们要改进上面的正则表达式,可以改为:
var r = /[\n\r]/;
// \n:换行
// \r:回车


上面的代码会解决所有系统下的问题,但会带来一个windows下切分文字的bug。对于如下的文字:
var text = 'abc\r\ncde';

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

于是有了改进2
var r = /[\n\r]+/;


这个切分开起来比较完美了,但是它忽略了空行。对于如下的文字:
var text = "abc\r\n\r\nddd";

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

改进3
var r = /\r\n|\n\r|[\n\r]/;

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


所以以上可以写成:
var r = /\r\n|[\r\n]/;


补充
对于不用考虑首末空格的可以考虑使用\s+,效率也较高。
分享到:
评论

相关推荐

    delphi7分割字符串

    delphi7分割字符串

    textbook输入内容后回车,光标定位在内容后面

    imei_arr = imei_str.split(';'); var num = imei_arr.length - 1; window.document.getElementById("taishuTxt").value = num; window.document.getElementById("imeiTxt").value = imei_str; focus(); ...

    Shell脚本实现简单分割字符串

    我们有这样一个字符串: 代码如下: info=’abcd;efgh’ 现在想获取abcd和efgh,我们可以简单地用cut工具来获取: 代码如下: fstr=`echo $info | cut -d \; -f 1` sstr=`echo $info | cut -d \;...

    高斯混合建模 GUI (GMM DEMO):期望最大化算法 (EM) 变体的 GUI (Split-EM-Discriminant)-matlab开发

    - 输入按钮按钮 1:打开数据文件 (.mat) 或 (.tif) 按钮 2:用鼠标绘制高斯数据左 m 按钮 = 绘制右 mbutton = 跳一个点回车键 = 完成 - 操作按钮按钮 3:开始 GMM 建模按钮 4:停止 GMM 建模 -输出按钮按钮 5:将 ...

    Python处理CSV与List的转换方法

    list_result=context.split(\n)# 以回车符\n分割成单独的行 #每一行的各个元素是以【,】分割的,因此可以 length=len(list_result) for i in range(length): list_result[i]=list_result[i].split

    在Python中输入一个以空格为间隔的数组方法

    然后在键盘中输入比如:123 456 789 111 222 以回车结束输入 得到的str_in为一个字符串,要将其转为一个列表有两种方法 方法一: >>> num = [int(n) for n in str_in.split()] 注意,因为int函数不能对列表操作,...

    JS字符串按逗号和回车分隔的方法

    split函数可以传入一个正则表达式作为分隔的字符串。 function foo(str){ var temp = str.split(/[\n,]/g); for(var i =0;i<temp.length;i++){ if(temp[i] == ){ temp.splice(i, 1); //删除数组索引位置应...

    Python实现把回车符\r\n转换成\n

    最近在做cocos2d-x的简明配置,发现有的朋友的文本编辑器,自动将\r\n截断成\n,(在unix上换行使用\n,windows上,换行使用的是\r\n)于是,写了这个脚本,希望对一些朋友有所帮助,不用一行一行去改 import os ...

    python 读txt文件,按‘,’分割每行数据操作

    print(line[:-1].split(',')) //切片去掉换行符,再以‘,'分割字符串 ,得到一个列表 s = [i[:-1].split(',') for i in f.readlines()] //列表生成器,将文件每行数据按上述方法处理后放入列表 # print(s) ...

    页面自动刷新,不用按回车键来提交数据!

    如果页面要自动刷新,但该页面有Request.Form,...–var limit=0:60 //定义刷新时间if (document.images){var parselimit=limit.split(:)parselimit=parselimit[0]*60+parselimit[1]*1}function beginrefresh(){if

    Android之EditText控制禁止输入空格和回车

    1.EdiTtext输入框控制不能输入空格,给EditText添加一个addTextChangedListener监听,如果有空格split截取截取再for循环将截取后不包含空格的字符串数组重新排列这样这个字符串就不包含空格了,最后将这个字符串重新...

    Leetcode434. 字符串中的单词数

    首先使用trim()去掉开头和结尾的空格,再使用split按照空格切分。 scala代码: /** * \\s表示 空格,回车,换行等空白符 * +号表示一个或多个 * * @param s * @return */ def countSegments(s: String): In

    vue.js给动态绑定的radio列表做批量编辑的方法

    textare每一行都是一条数据,它的内部是根据回车来区分(break-word自动换行不算),每一行是一个对象,整体就是一个文本数组了,获取如下: var contents = $("#optionsArea").val().split("\n"); 获取到数组,他...

    正则表达式

    4) String[] split(String regex)根据给定正则表达式拆分该字符串后得到的字符串数组。 3、 创建正则表达式: 正则表达式中使用的常见字符: 1) \t:制表符(‘\u0009’). 2) \n:换行(‘\u000A’)。 3) \r:回车(...

    关于python中导入文件到list的问题

    这里的temp1根据每一行的分隔符来读入,‘\n’表述回车 temp2表示每一行内的分隔符,可以自定义(例如图中’,’,还有’\t’表示空格等) def loadDatadet(infile): f=open(infile,'r') sourceInLine=f.readlines...

    Python实现中一次读取多个值的方法

    Python 2里面读取输入的函数是raw_input(), Python 3的是input(),读入一个值后回车读取输入就退出了,想要一次读取多个输入,可以像下面这样: a, b = raw_input().split() 输出的是字符串,要想读取的是数值,...

    python 读入多行数据的实例

    本文主要使用python 的raw_input() 函数读入多行不定长的数据,输入结束的标志就是不输入数字情况下直接回车,并填充特定的数作为二维矩阵 二、代码 def get2DlistData(): res = [] inputLine = raw_input() #以...

    python字符串分割及字符串的一些常规方法

    语法:str.split(sep, [,max]),sep可以指定切割的符号,max可以指定切割的次数(次数不常用) 不带参数时以空格进行分割 带参数时,以该参数进行分割 未查询到分隔符时,列表只包含原始字符串 source =1,2,3,4,5,,...

    C#.net_经典编程例子400个

    96 实例077 带复选框的树状菜单 98 2.9 其他控件典型应用 100 实例078 TrackBar的简单应用 100 实例079 SplitContainer的应用 102 实例080 MaskedTextBox控件的简单应用 103 实例081 ...

Global site tag (gtag.js) - Google Analytics