Javascript JS正则表达式按行拆分

Javascript JS正则表达式按行拆分,javascript,regex,newline,Javascript,Regex,Newline,如何将一长段文本拆分为单独的行?为什么这条回程线有两次 [“第1行”、“第1行”] 我打开了多行修改器,使^和$匹配行的开头和结尾。我还打开了“全局”修改器以捕捉所有线 我希望使用正则表达式拆分,而不是String.split,因为我将同时处理Linux\n和Windows\r\n行结尾 首先将所有\r\n替换为\n,然后字符串。拆分使用 result = subject.split(/\r?\n/); 您的正则表达式返回line1两次,因为line1既是整个匹配项,也是第一个捕获组的内容 a

如何将一长段文本拆分为单独的行?为什么这条回程线有两次

[“第1行”、“第1行”]

我打开了多行修改器,使
^
$
匹配行的开头和结尾。我还打开了“全局”修改器以捕捉所有线


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

首先将所有
\r\n
替换为
\n
,然后
字符串。拆分

使用

result = subject.split(/\r?\n/);
您的正则表达式返回
line1
两次,因为
line1
既是整个匹配项,也是第一个捕获组的内容

arrayOfLines = lineString.match(/[^\r\n]+/g);

正如蒂姆所说,这既是整场比赛,也是捕获。无论全局修饰符如何,当
string.match(regex)
是全局修饰符时,
regex.exec(string)
在查找第一个匹配项时返回。我假设以下是换行符

  • \r后跟\n
  • \n后跟\r\n
  • \单独出席
  • \他独自一人在场
  • 请使用

    var re=/\r\n|\n\r|\n|\r/g;
    
    arrayofLines=lineString.replace(re,"\n").split("\n");
    
    arrayOfLines = lineString.match(/[^\r\n]+/g); 
    
    对于包含所有行(包括空行)的数组

    请使用

    var re=/\r\n|\n\r|\n|\r/g;
    
    arrayofLines=lineString.replace(re,"\n").split("\n");
    
    arrayOfLines = lineString.match(/[^\r\n]+/g); 
    
    对于非空行数组

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


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

    更简单的正则表达式,它处理所有行结束组合,甚至混合在同一个文件中,并删除空行:

    var lines=text.split(/[\r\n]+/g)

    使用空格修剪:


    var lines=text.trim().split(/\s*[\r\n]+\s*/g)

    这需要两个命令。使用正则表达式可以在一个命令中完成吗?@JoJo:
    myString.replace(/\r\n/,“\n”).split(“\n”)
    (除非您出于学术兴趣而询问:)
    “line1\r\nline2\r\n”。replace(/\r\n/,“\n”).split(“\n”)。不带(“”)
    生成了错误的第二个单元格:
    [“line1”,“line2\r”]
    @JoJo:对不起,我忘记了全局的
    /g
    标志!它应该是:
    myString.replace(/\r\n/g,“\n”).split(“\n”)
    @Jojo:这一行简洁明了:)正则表达式不是每个作业的工具。它们可以非常强大,但不应该在任何地方使用。请注意,
    replace
    是一个正则表达式。请注意,Tim的将匹配空行,而我的将不匹配。可能需要,也可能不需要。答案很老,但我想说的是,
    exec
    在第一次匹配时返回的原因是,它打算为全局正则表达式多次调用,直到它返回null,并且正则表达式存储类似于
    lastIndex
    的内容,即开始下一次匹配的索引。请尝试
    “123\n\n1234”.match(/[^\r\n]+/g)
    应该是
    数组[“123”,“1234”]
    ,但是得到了
    数组[“123”,“1234”]
    您需要使用
    g
    标志,
    \r
    在一些旧的apple机器上是有效的换行符。此外,unicode将
    \u2028
    \u2029
    和旧的IBM新行
    \u0085
    定义为新行。所以
    /[\n\u0085\u2028\u2029]|\r\n?/g
    处理所有的边缘情况。@Mike:你确定
    /g
    标志吗?除非另有明确说明,否则使用只拆分一次的拆分函数是没有意义的。Jojo说他只是在处理Linux和Windows。下一步怎么办,EBCDIC?@Mike:不,不需要
    /g
    标志。您可以添加它,但JavaScript会忽略它。正如Tim所说,默认行为是尽可能多次拆分,但你可以使用第二个参数来施加最大值。至于新行的构成,甚至比这更糟糕。根据标准,我们应该始终使用
    (\r\n |[\n\v\f\r\x85\u2028\u2029])
    ,无论软件运行在哪个平台上,或者数据来自哪里。@Alan,非常正确。“代码”> G/<代码>标志控制是否将捕获组包含在输出中。这就结束了行分隔符。第一个删除文本中间的空行,但不是在开始或结束。就我的目的而言,这很好,我只是为需要删除一致性的任何人指出这一点。
    \n
    后跟
    \r
    并不是一个单独的换行符,而是在某些平台上。如果在C中选中Environment.NewLine,您将看到\n\r