假设我有这样一段文字:
* hello world hello again
在Javascript中使用RegEx,如何在所有平台中用\替换段落之间的所有新行(除了第一行)?所以实际上结果会是,
\
* hello \ world \ \ hello again
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);
(^[ \t]*|\S\n?)?[ \t]*(?!^)\n
oogrdqng2#
你可以使用一个look-behindAssert来解释前面的空行,它应该保持不变,这不需要回调,也不需要对换行符的类型做任何假设(\r或\n或组合)--它只依赖于^和$行定界锚:
\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调用...
replace
l7wslrjt3#
尝试使用.split()保留所有不应转换为\的内容,然后使用.map()将所有空白转换为\,然后重新组合行:
.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进行了基准测试,发现我的答案稍微快一些。
mbskvtky4#
如果可以在JavaScript中使用lookbehind assertion,则可以匹配一个换行符,然后检查当前位置的正左侧是否是一个字符(没有换行符),后面跟有3个或更多换行符。
const s = `* hello world hello again`; const regex = /\n(?<=.\n{3,})/gm; console.log(s.replace(regex, "\\\n"));
4条答案
按热度按时间thigvfpy1#
你可以capture一个非换行符(通常是dot)和一个optional换行符,然后使用callback检查是否设置了 first group。如果是,返回完全匹配,否则在换行符前加上反斜杠。
(^[ \t]*|\S\n?)?[ \t]*(?!^)\n
oogrdqng2#
你可以使用一个look-behindAssert来解释前面的空行,它应该保持不变,这不需要回调,也不需要对换行符的类型做任何假设(
\r
或\n
或组合)--它只依赖于^
和$
行定界锚:请参阅JSBench上的执行时间比较:
当您需要支持未完全实现ECMAScript 2018的平台时,您可以选择首先修剪尾随白色行,然后应用以下基于正则表达式的替换:
如果您确定输入中没有任何只有白色的行,则可以省略第一个
replace
调用...l7wslrjt3#
尝试使用
.split()
保留所有不应转换为\
的内容,然后使用.map()
将所有空白转换为\
,然后重新组合行:我在JSBench中将这个答案与bobble bubble's answer进行了基准测试,发现我的答案稍微快一些。
mbskvtky4#
如果可以在JavaScript中使用lookbehind assertion,则可以匹配一个换行符,然后检查当前位置的正左侧是否是一个字符(没有换行符),后面跟有3个或更多换行符。