如何将一段长文本分成不同的行?为什么这会两次返回 line1 ?
/^(.*?)$/mg.exec('line1\r\nline2\r\n');
[“line1”,“line1”]
我打开了多行修饰符,使^
和$
匹配行的开头和结尾。我还打开了全局修改器来捕获所有行。
我希望使用正则表达式拆分而不是String.split
,因为我将处理Linux \n
和Windows \r\n
行结尾。
答案 0 :(得分:120)
arrayOfLines = lineString.match(/[^\r\n]+/g);
蒂姆说,这是整个比赛和捕捉。无论全局修饰符如何,regex.exec(string)
都会在找到第一个匹配时返回,而string.match(regex)
则表示全球。
答案 1 :(得分:89)
使用
result = subject.split(/\r?\n/);
你的正则表达式返回line1
两次,因为line1
是整个匹配和第一个捕获组的内容。
答案 2 :(得分:22)
我假设以下构成换行符
请使用
var re=/\r\n|\n\r|\n|\r/g;
arrayofLines=lineString.replace(re,"\n").split("\n");
表示所有行的数组,包括空行。
或强>
请使用
arrayOfLines = lineString.match(/[^\r\n]+/g);
对于非空行数组
答案 3 :(得分:18)
甚至更简单的正则表达式处理所有行结束组合,甚至混合在同一个文件中,并删除空行:
var lines = text.split(/[\r\n]+/g);
使用空白修剪:
var lines = text.trim().split(/\s*[\r\n]+\s*/g);
答案 4 :(得分:8)
首先将所有\r\n
替换为\n
,然后 String.split
。
答案 5 :(得分:1)
Unicode® 技术标准 #18 定义了 line boundaries 的构成。同一部分还提供了一个正则表达式来匹配所有行边界。使用该正则表达式,我们可以定义以下 JS 函数,该函数在任何行边界处拆分给定的字符串(保留空行以及前导和尾随空格):
const splitLines = s => s.split(/\r\n|(?!\r\n)[\n-\r\x85\u2028\u2029]/)
我不明白为什么需要否定前瞻部分 ((?!\r\n)
),但这是 Unicode 文档?♂️ 中建议的内容。
以上文档建议定义一个正则表达式元字符,用于匹配所有行尾字符和序列。 Perl has \R
。不幸的是,JavaScript 不包含这样的元字符。唉,我什至找不到 TC39 的提案。
答案 6 :(得分:0)