在JavaScript中保留分隔符的同时拆分新行上的字符串

在JavaScript中保留分隔符的同时拆分新行上的字符串,javascript,regex,Javascript,Regex,我有一根像下面这样的绳子 text = "\n first \n second \n third" 我想在新行字符上拆分此字符串,并保留分隔符\n和\r\n。到目前为止,我尝试了此文本。拆分/?=\r?\n/g 结果如下: ["↵ first ", "↵ second ", "↵ third"] 但我想要这个: ["↵", " first ↵", " second ↵", " third"] 正确的正则表达式是什么?您的JavaScript版本可能不支持lookbehinds。但我们可以使

我有一根像下面这样的绳子

text = "\n first \n second \n third"
我想在新行字符上拆分此字符串,并保留分隔符\n和\r\n。到目前为止,我尝试了此文本。拆分/?=\r?\n/g 结果如下:

["↵ first ", "↵ second ", "↵ third"]
但我想要这个:

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

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

您的JavaScript版本可能不支持lookbehinds。但我们可以使用一个技巧来避免它们:

text=\n第一个\n第二个\n第三个 text=text.replace/\n/mg\n\n; terms=text.split/\n\n/;
console.logterms 您的JavaScript版本可能不支持lookbehinds。但我们可以使用一个技巧来避免它们:

text=\n第一个\n第二个\n第三个 text=text.replace/\n/mg\n\n; terms=text.split/\n\n/;
console.logterms 您可以将任意文本匹配到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 您可以将任意文本匹配到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 您可以在[^\n]*\n上匹配吗?启用g标志:

text=\n\n first\n\n sth\r与\r\n second\r\n third\n forth\r; console.logtext.match/[^\n]*\n?/g 您可以在[^\n]*\n上匹配吗?启用g标志:

text=\n\n first\n\n sth\r与\r\n second\r\n third\n forth\r;
console.logtext.match/[^\n]*\n?/g 您可以使用以下简单的正则表达式:

/.*?(\n|$)/g
它将匹配任何字符的任意数目,包括换行符“\n或字符串结尾


您可以访问匹配项,因为数组的工作方式类似于拆分,但在匹配项中保留分隔符。

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

/.*?(\n|$)/g
它将匹配任何字符的任意数目,包括换行符“\n或字符串结尾



您可以访问匹配项,因为数组的工作方式类似于拆分,但在匹配项中保留分隔符。

如果您的环境支持Lookback=如果它支持ECMAScript 2018,请使用text.split/?可能重复@WiktorStribiżew不幸的是,如果您的环境支持Lookback=如果它支持ECMAScript 2018,使用text.split/?可能重复@WiktorStribiżew不幸的是,它不支持听起来很棒,但这是一种小技巧。还有其他好办法吗?@Reza是的,请阅读上面Wiktor的评论,看看是否可以在拆分之前使用lookback检查\n。如果你不能使用lookarounds,那么你需要一些替代方法,比如我的答案。听起来不错,但这是一种小技巧。还有其他好办法吗?@Reza是的,请阅读上面Wiktor的评论,看看是否可以在拆分之前使用lookback检查\n。如果你不能使用lookarounds,那么你需要一些替代方法,比如我的答案。听起来不错:这个/^$/如果有两个类似\n\n first\n second\n的结果,m将失败third@Reza否,请参见上一个演示中的第三个示例。还是说应该有3个单独的\n项?那么第一个解是最稳健的,第三个例子的结果是[↵↵↵, 第一↵, 第二,第三]应该是这样的[↵, ↵, ↵, 第一↵, 第二↵, 第三]像ECMA 2018中模式的结果听起来很棒:这个/^$/如果有两个类似\n\n first\n second\n的结果,m将失败third@Reza否,请参见上一个演示中的第三个示例。还是说应该有3个单独的\n项?那么第一个解是最稳健的,第三个例子的结果是[↵↵↵, 第一↵, 第二,第三]应该是这样的[↵, ↵, ↵, 第一↵, 第二↵, 第三]与ECMA 2018中模式的结果一样,问题要求在标题和上下文中\n而不是\r\n。我只在OP的正则表达式中看到\r,这可能是偶然的。@revo如果您的答案包含此/?=。^/mg将失败,如果您有两个后续的\n,如\n\n first\n second\nthird@Reza更新。这是实现它最简单的正确方法。问题要求在标题和上下文中\n而不是\r\n。我只在OP的正则表达式中看到\r,这可能是偶然的。@revo如果您的答案包含此/?=。^/mg将失败,如果您有两个后续的\n,如\n\n first\n second\nthird@Reza更新。这是最简单的方法。