我有一个类似下面的字符串;
text = "\n first \n second \n third"
我想将此字符串拆分为换行符并保留定界符(\ n和\ r \ n)。到目前为止,我已经尝试过此text.split( /(?=\r?\n)/g )
结果如下:
["↵ first ", "↵ second ", "↵ third"]
但是我想要这个:
["↵", " first ↵", " second ↵", " third"]
正确的正则表达式是什么?
答案 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
的形式访问匹配项(类似于拆分,但将分隔符保留在匹配项中)。