JavaScript拆分多行字符串如何避免误拆字符串内的转义换行
问题根因
你的代码无法得到预期结果,核心是两个问题:
- 正则写法错误:
/$\\n/g中的$是匹配字符串末尾的锚点元字符,根本不是用来匹配换行位置的,属于误用。 - 运行时无法区分两类换行:如果你在模板字符串中直接写
\n,JS解析代码时会直接把它转成真实的换行控制符(LF,ASCII 10),和你手动敲回车产生的换行符完全一模一样,没有任何差异标记,这种情况下不可能做到只拆分手动敲的回车、不拆分转义写出的换行。
可行实现
如果你的需求是拆分后保留内容里的字面量\n(即反斜杠+字符n,不是真实的换行效果),只需要在定义字符串时转义反斜杠,直接按真实换行符拆分即可,不需要调用JSON.stringify:
const str = ` Hello World its\\nbeautiful`; // 拆分后如果不需要开头空串,可以自行调整过滤逻辑 const lineArr = str.split('\n'); console.log(lineArr); // 输出:["", "Hello", "World\t", "its\\nbeautiful"]
如果你必须基于JSON.stringify的结果做拆分,要避开内容里自带的字面量\n,可以用负向后行断言正则,只匹配前面没有反斜杠的转义换行:
const str = ` Hello World its\\nbeautiful`; const lineArr = JSON.stringify(str).split(/(?<!\\)\\n/g); console.log(lineArr); // 输出:["\"", "Hello", "World\t", "its\\nbeautiful\""]
这个输出和你给出的预期结果结构完全一致,首尾的"是JSON.stringify序列化字符串时自动添加的边界双引号。
注意:如果定义字符串时
its和beautiful之间你写的是单转义\n(即会被解析成真实换行的写法),没有任何方案能在运行时把它和手动敲的回车区分开,这是JS语言解析规则决定的,必须从字符串定义阶段修正转义写法。
内容的提问来源于stack exchange,提问作者Vladislav
相关产品推荐
相关产品推荐

