JS正则表达式逐行分割

时间:2011-02-17 21:17:45

标签: javascript regex newline

如何将一段长文本分成不同的行?为什么这会两次返回 line1

/^(.*?)$/mg.exec('line1\r\nline2\r\n');
  

[“line1”,“line1”]

我打开了多行修饰符,使^$匹配行的开头和结尾。我还打开了全局修改器来捕获所有行。

我希望使用正则表达式拆分而不是String.split,因为我将处理Linux \n和Windows \r\n行结尾。

7 个答案:

答案 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)

我假设以下构成换行符

  1. \ r \ n后跟\ n
  2. \ n后跟\ n
  3. \ n单独出席
  4. \ r单独出席
  5. 请使用

    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 兼容的行拆分

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)

http://jsfiddle.net/uq55en5o/

var lines = text.match(/^.*((\r\n|\n|\r)|$)/gm);

我做过类似的事情。以上链接是我的小提琴。