在新行上分割字符串,同时在JavaScript中保留定界符

时间:2018-11-05 20:57:34

标签: javascript regex

我有一个类似下面的字符串;

text = "\n first \n second \n third"

我想将此字符串拆分为换行符并保留定界符(\ n和\ r \ n)。到目前为止,我已经尝试过此text.split( /(?=\r?\n)/g ) 结果如下:

["↵ first ", "↵ second ", "↵ third"]

但是我想要这个:

["↵", " first ↵", " second ↵", " third"]

正确的正则表达式是什么?

4 个答案:

答案 0 :(得分:2)

您的JavaScript版本可能不支持后向。但这是我们可以避免的技巧:

text = "\n first \n second \n third"
text = text.replace(/\n/mg, "\n\n");
terms = text.split(/\n(?!\n)/);
console.log(terms);

这可以通过将其中每个换行符\n替换为其中两个\n\n,然后在\n(?!\n)上拆分来实现。也就是说,在进行了替换之后,我们在\n上拆分,该符号 not 后跟另一个换行符。这样会导致在拆分过程中消耗第二个换行符,同时保留我们要在输出中出现的第一条换行符。

答案 1 :(得分:2)

您可以在[^\n]*\n?上进行匹配(启用g标志):

text = "\n\n first \n\n sth \r with \r\n second \r\n third \n forth \r";
console.log(text.match(/[^\n]*\n?/g));

您可能需要.pop()返回值,因为最后一个值始终是一个空字符串:

var matches = text.match(/[^\n]*\n?/g);
matches.pop();

答案 2 :(得分:1)

您可以将任何文本匹配到CRLF或LF或字符串末尾:

text.match(/.*(?:$|\r?\n)/g).filter(Boolean)
// -> (4) ["↵", " first ↵", " second ↵", " third"]

.*(?:$|\r?\n)模式匹配

  • .*-除换行符外的0个或多个字符
  • (?:$|\r?\n)-字符串结尾或可选的回车符和换行符。

JS演示:

console.log("\r\n first \r\n second \r\n third".match(/.*(?:$|\r?\n)/g));
console.log("\n first \r\n second \r third".match(/.*(?:$|\r?\n)/g));
console.log("\n\n\n first \r\n second \r third".match(/.*(?:$|\r?\n)/g));

对于支持JS环境的ECMAScript 2018标准,它就像使用后向模式一样简单

text.split(/(?<=\r?\n)/)

它将在紧跟可选CR + LF符号的所有位置分开。

另一个拆分正则表达式为/^(?!$)/m

console.log("\r\n first \r\n second \r\n third".split(/^(?!$)/m));
console.log("\n first \r\n second \r third".split(/^(?!$)/m));
console.log("\n\n\n first \r\n second \r third".split(/^(?!$)/m));

在这里,字符串在CR或LF之后但不在行尾的每个位置处进行分割。

请注意,String#split不需要全局修饰符,因为默认情况下它会在所有找到的位置分割。

答案 3 :(得分:0)

您可以使用以下简单的正则表达式:

/.*?(\n|$)/g

它将匹配任何数量的任何字符,包括Newline'\ n或字符串结尾。

您可以以array的形式访问匹配项(类似于拆分,但将分隔符保留在匹配项中)。