如何在 JavaScript 正则表达式中用 (n-1) 次出现的同一字符替换 (n) 次出现的字符

Har*_*Das 3 javascript regex string replace

我的数据是

\n
Hello ***** World\n
Run Code Online (Sandbox Code Playgroud)\n

我需要

\n
Hello **** World\n
Run Code Online (Sandbox Code Playgroud)\n

所以基本上 5 次出现的星号被替换为 4 次出现的星号。我怎样才能做到这一点在正则表达式javascript中。

\n

注意:星星的数量是动态的。

\n

我尝试过此操作,但不确定如何替换捕获组:

\n

\r\n
\r\n
Hello ***** World\n
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

更新:

\n

Wiktor 的解决方案非常有效。但不确定如何将其转化为我在正则表达式中面临的实际问题。所以我想,发布我的实际问题是值得的。

\n

我的数据是这样的:

\n
1.  Hello\n\n\n\xe2\x80\xa2   World\n
Run Code Online (Sandbox Code Playgroud)\n

我需要这个

\n
1.  Hello\n\n\xe2\x80\xa2   World\n
Run Code Online (Sandbox Code Playgroud)\n

我需要将之间的额外行数减少到 n-1

\n
[Numeric].[Space][Any text]\n\nand\n\n\xe2\x80\xa2[Three Spaces][AnyText]\n
Run Code Online (Sandbox Code Playgroud)\n

反之亦然

\n
\xe2\x80\xa2[Three Spaces][AnyText]\n\nand \n\n[Numeric].[Space][Any text]\n
Run Code Online (Sandbox Code Playgroud)\n

注意:抱歉解释不好。我是正则表达式新手。

\n

Wik*_*żew 5

您可以捕获一个或多个星号,然后进行匹配而不捕获另一个(序列中的最后一个)星号,并替换为对组值的反向引用:

\n

\r\n
\r\n
console.log("Hello ***** World".replace(/(\\*+)\\*/g, "$1"));
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

请参阅正则表达式演示

\n

这里还有其他类似的解决方案:

\n

\r\n
\r\n
console.log("Hello ***** World".replace(/(\\*)\\*(?!\\*)/g, \'$1\'));\nconsole.log("Hello ***** World".replace(/(?<=\\*)\\*(?!\\*)/g, \'\'));
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

请参阅正则表达式演示 #2正则表达式演示 #3

\n

在 中(\\*)\\*(?!\\*),第一个*被捕获到组 1 中,然后匹配其右侧没有其他星号的星号,并且$1替换项将执行第一个解决方案中的工作。

\n

正则表达式(?<=\\*)\\*(?!\\*)仅匹配左侧紧邻星号且右侧紧邻没有星号的任何星号(这就是替换模式为空的原因)。

\n

将其应用于减少两个字符串之间的换行数量问题可能看起来像

\n
text = text.replace(/(\\d+\\.\\s.*(?:\\r\\n?|\\n)+)(?:\\r\\n?|\\n)(?=\xe2\x80\xa2\\s{3})/g, \'$1\').replace(/(\xe2\x80\xa2\\s{3}.*(?:\\r\\n?|\\n)+)(?:\\r\\n?|\\n)(?=\\d+\\.\\s)/g, \'$1\')\n
Run Code Online (Sandbox Code Playgroud)\n

请参阅此演示另一个“反之亦然”演示

\n

此处,(?:\\r\\n?|\\n)替换了\\*模式并匹配 CRLF、LF 或 CR 行结尾。\\s{3}匹配任意三个空白字符。\\d+\\.\\s匹配一个或多个数字.和一个空格,并.*匹配除换行符之外的任何零个或多个字符,尽可能多(行模式的其余部分)。前瞻 ,(?=...)用于确保连续匹配项被匹配。

\n