您如何将一长段文本分成几行?为什么此返回line1两次?
/^(.*?)$/mg.exec('line1\r\nline2\r\n');
[“ line1”,“ line1”]
我打开多行修改,以使^
与$
匹配的开始和行结束。我还打开了全局修饰符以捕获所有行。
我希望使用正则表达式拆分,而不是String.split
因为我将同时处理Linux\n
和Windows\r\n
行尾。
Answers:
arrayOfLines = lineString.match(/[^\r\n]+/g);
正如蒂姆所说,这既是整个比赛,又是一场比赛。regex.exec(string)
不论全局修饰符string.match(regex)
是什么,在寻找第一个匹配项时似乎都会得到回报,而惠氏则是在尊重全局。
exec
第一次匹配时返回的原因是因为它打算被全局正则表达式多次调用,直到它返回null为止,并且正则表达式存储着类似lastIndex
下一个开始下一个索引的内容比赛。
使用
result = subject.split(/\r?\n/);
您的正则表达式返回line1
两次,因为line1
它既是整个匹配项,又是第一个捕获组的内容。
g
标志,并且\r
在某些旧的苹果计算机上是有效的换行符。另外,unicode将\u2028
,\u2029
和旧的IBM换行符定义\u0085
为换行符。因此/[\n\u0085\u2028\u2029]|\r\n?/g
处理所有边缘情况。
/g
旗帜吗?除非另有明确说明,否则拥有仅拆分一次的split函数没有意义。Jojo说他只在处理Linux和Windows。接下来,EBCDIC?
/g
标志。您可以添加它,但是JavaScript只会忽略它。正如Tim所说,默认行为是尽可能多地拆分,但是您可以使用第二个参数施加最大值。
(\r\n|[\n\v\f\r\x85\u2028\u2029])
,无论软件在什么平台上运行或数据来自何处,我们都应始终使用。
g
标志控制捕获组是否包含在输出中。
首先替换所有\r\n
带\n
,然后 String.split
。
myString.replace(/\r\n/, "\n").split("\n")
除非您出于学术兴趣而发问:))
'line1\r\nline2\r\n'.replace(/\r\n/, '\n').split('\n').without('');
产生错误的第二个单元格:["line1", "line2\r"]
/g
全球标志!应该是:myString.replace(/\r\n/g, "\n").split("\n")
replace
是一个正则表达式。