JS正则表达式逐行分割

JoJ*_*oJo 67 javascript regex newline

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

/^(.*?)$/mg.exec('line1\r\nline2\r\n');
Run Code Online (Sandbox Code Playgroud)

["line1","line1"]

我打开了多行修改器来匹配^$匹配行的开头和结尾.我还打开了全局修改器以捕获所有行.

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

Rea*_*ven 128

arrayOfLines = lineString.match(/[^\r\n]+/g);
Run Code Online (Sandbox Code Playgroud)

正如蒂姆所说,这是整个比赛和捕获.regex.exec(string)无论全局修饰符如何,它都会在找到第一场比赛时获得回报,而这些回归是为了string.match(regex)纪念全局.

  • 作为一个注释,蒂姆将匹配空行,而我的不会.可能是也可能不是可取的. (9认同)

Tim*_*ker 95

使用

result = subject.split(/\r?\n/);
Run Code Online (Sandbox Code Playgroud)

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

  • 至于什么构成换行,它甚至比这更糟糕.根据[Unicode Consortium](http://www.unicode.org/reports/tr18/#Line_Boundaries)我们应该总是使用`(\ r \n | [\n\v\f\r\x\x85\u2028\u2029])`,无论软件在什么平台上运行,或者数据来自何处. (20认同)
  • @Mike:你确定`/ g`标志?除非另有明确说明,否则使用仅拆分一次的拆分功能是没有意义的.Jojo说他只处理Linux和Windows.接下来是什么,EBCDIC? (6认同)
  • 你需要使用`g`标志,而`\ r``是一些旧苹果机器上的有效换行符.此外,unicode将`\ u2028`,`\ u2029`和旧的IBM换行符`\ u0085`定义为换行符.所以`/ [\n\u0085\u2028\u2029] |\r \n?/ g`处理所有边缘情况. (4认同)
  • @Mike:不,不需要`/ g`标志.你可以添加它,但JavaScript只是忽略它.正如蒂姆所说,默认行为是尽可能多地拆分,但你可以使用第二个参数来强加最大值. (4认同)

Aru*_*ore 22

我假设以下构成换行符

  1. \ r后跟\n
  2. \n后跟\ r \n
  3. \n单独出席
  4. \ r \n独自存在

请用

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

arrayofLines=lineString.replace(re,"\n").split("\n");
Run Code Online (Sandbox Code Playgroud)

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

要么

请用

arrayOfLines = lineString.match(/[^\r\n]+/g); 
Run Code Online (Sandbox Code Playgroud)

对于非空行数组


cis*_*eat 19

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

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

使用空白修剪:

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


rap*_*sse 9

符合 Unicode 的行分割

\n

Unicode\xc2\xae 技术标准 #18定义了行边界的构成。该同一部分还提供了一个正则表达式来匹配所有行边界。使用该正则表达式,我们可以定义以下 JS 函数,该函数在任意行边界处分割给定的字符串(保留空行以及前导和尾随空格):

\n
const splitLines = s => s.split(/\\r\\n|(?!\\r\\n)[\\n-\\r\\x85\\u2028\\u2029]/)\n
Run Code Online (Sandbox Code Playgroud)\n

我不明白为什么负前瞻部分 ( (?!\\r\\n)) 是必要的,但这就是 Unicode 文档 \xe2\x80\x8d\xe2\x99\x82\xef\xb8\x8f 中建议的内容。

\n

上述文档建议定义一个正则表达式元字符来匹配所有行结束字符和序列。Perl 就有\\R这样的能力。不幸的是,JavaScript 不包含这样的元字符。唉,我什至找不到相关的 TC39 提案。

\n


Tim*_*Tim 6

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

  • @Jojo:_This_简洁地在一行:)正则表达不是每个工作的工具.它们可以非常强大,但不应该在任何地方使用.注意`replace` _is_是一个正则表达式. (3认同)
  • @JoJo:`myString.replace(/\r\n/, "\n").split("\n")`(除非你是因为学术兴趣而问:)) (2认同)