regex 正则表达式:匹配除第一行以外的所有换行符

5q4ezhmt  于 2022-12-30  发布在  其他
关注(0)|答案(4)|浏览(368)

假设我有这样一段文字:

* hello

  
world


hello again

在Javascript中使用RegEx,如何在所有平台中用\替换段落之间的所有新行(除了第一行)?
所以实际上结果会是,

* hello

\
world

\
\
hello again
thigvfpy

thigvfpy1#

你可以capture一个非换行符(通常是dot)和一个optional换行符,然后使用callback检查是否设置了 first group。如果是,返回完全匹配,否则在换行符前加上反斜杠。

const s = `* hello

world


hello again`;

const res = s.replace(/(.\n?)?\n/g, (m0, m1) => m1 ? m0 : '\\\n');

console.log(res);
  • 要防止在开始时可能出现匹配,请使用lookahead:第一个月
  • 考虑水平间距的行:(^[ \t]*|\S\n?)?[ \t]*(?!^)\n
oogrdqng

oogrdqng2#

你可以使用一个look-behindAssert来解释前面的空行,它应该保持不变,这不需要回调,也不需要对换行符的类型做任何假设(\r\n或组合)--它只依赖于^$行定界锚:

const s = `* hello

  
world


hello again
`;

const res = s.replace(/(?<=^ *$\s+?^) *$/gm, "\\");
console.log(res);

请参阅JSBench上的执行时间比较:
当您需要支持未完全实现ECMAScript 2018的平台时,您可以选择首先修剪尾随白色行,然后应用以下基于正则表达式的替换:

const s = `* hello
   
  
world
   
  
   
hello again
`;

const res = s.replace(/[ \t]+$/gm, "").replace(/^\s+?$/gm, "$&\\");
console.log(res);

如果您确定输入中没有任何只有白色的行,则可以省略第一个replace调用...

l7wslrjt

l7wslrjt3#

尝试使用.split()保留所有不应转换为\的内容,然后使用.map()将所有空白转换为\,然后重新组合行:

s = `* hello

world


hello again`;

s = s.split(/.*?(?<=\n)\n/g).map(x => x === '' ? '\\' : x).join('\n');
console.log(s)

我在JSBench中将这个答案与bobble bubble's answer进行了基准测试,发现我的答案稍微快一些。

mbskvtky

mbskvtky4#

如果可以在JavaScript中使用lookbehind assertion,则可以匹配一个换行符,然后检查当前位置的正左侧是否是一个字符(没有换行符),后面跟有3个或更多换行符。

const s = `* hello

world


hello again`;

const regex = /\n(?<=.\n{3,})/gm;

console.log(s.replace(regex, "\\\n"));

相关问题