Javascript JS正则表达式按行拆分
如何将一长段文本拆分为单独的行?为什么这条回程线有两次 [“第1行”、“第1行”] 我打开了多行修改器,使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
^
和$
匹配行的开头和结尾。我还打开了“全局”修改器以捕捉所有线
我希望使用正则表达式拆分,而不是
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