JS正则表达式按行拆分


78

您如何将一长段文本分成几行?为什么此返回line1两次?

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

[“ line1”,“ line1”]

我打开多行修改,以使^$匹配的开始和行结束。我还打开了全局修饰符以捕获所有行。

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

Answers:


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

正如蒂姆所说,这既是整个比赛,又是一场比赛。regex.exec(string)不论全局修饰符string.match(regex)是什么,在寻找第一个匹配项时似乎都会得到回报,而惠氏则是在尊重全局。


9
值得注意的是,蒂姆的将匹配空行,而我的不会。可能需要也可能不需要。
ReactiveRaven

旧的答案,但我想说的是exec第一次匹配时返回的原因是因为它打算被全局正则表达式多次调用,直到它返回null为止,并且正则表达式存储着类似lastIndex下一个开始下一个索引的内容比赛。
iPherian

105

使用

result = subject.split(/\r?\n/);

您的正则表达式返回line1两次,因为line1它既是整个匹配项,是第一个捕获组的内容。


4
您需要使用该g标志,并且\r在某些旧的苹果计算机上是有效的换行符。另外,unicode将\u2028\u2029和旧的IBM换行符定义\u0085为换行符。因此/[\n\u0085\u2028\u2029]|\r\n?/g处理所有边缘情况。
Mike Samuel

7
@Mike:你确定/g旗帜吗?除非另有明确说明,否则拥有仅拆分一次的split函数没有意义。Jojo说他只在处理Linux和Windows。接下来,EBCDIC?
蒂姆·皮茨克

4
@Mike:不,不需要/g标志。您可以添加它,但是JavaScript只会忽略它。正如Tim所说,默认行为是尽可能多地拆分,但是您可以使用第二个参数施加最大值。
艾伦·摩尔

23
至于什么是换行符,甚至更糟。根据Unicode联盟的说法(\r\n|[\n\v\f\r\x85\u2028\u2029]),无论软件在什么平台上运行或数据来自何处,我们都应始终使用。
艾伦·摩尔

@Alan,非常正确。该g标志控制捕获组是否包含在输出中。
Mike Samuel

26

我假设以下构成换行符

  1. \ r后跟\ n
  2. \ n,然后是\ r
  3. \ n一个人在场
  4. \ r一个人在场

请用

var re=/\r\n|\n\r|\n|\r/g;

arrayofLines=lineString.replace(re,"\n").split("\n");

对于所有行的数组,包括空行。

要么

请用

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

对于非空行的数组


\n其次\r不是单个换行符
JLRishe

22

甚至更简单的正则表达式也可以处理所有行尾组合,甚至混合在同一文件中,也可以删除空行:

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

使用空格修剪:

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


1
第一个删除文本中间的空行,但不删除开头或结尾的空行。出于我的目的,这很好,我只是向需要删除操作以保持一致的任何人指出这一点。
twm

6

首先替换所有\r\n\n然后 String.split


这需要两个命令。可以用正则表达式在一个命令中完成吗?
JoJo

2
@JoJo :(myString.replace(/\r\n/, "\n").split("\n")除非您出于学术兴趣而发问:))
Tim

'line1\r\nline2\r\n'.replace(/\r\n/, '\n').split('\n').without('');产生错误的第二个单元格:["line1", "line2\r"]
JoJo

@JoJo:对不起,我忘了/g全球标志!应该是:myString.replace(/\r\n/g, "\n").split("\n")
Tim

3
@Jojo:是在简洁一行:)的正则表达式是不是每项作业的工具。它们可能非常强大,但不应在任何地方使用。请注意,这replace 一个正则表达式。
蒂姆(Tim)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.