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

How to replace (n) occurrences of a character with (n-1) occurrences of the same character in JavaScript Regex

我的数据是

Hello ***** World

我需要

Hello **** World

所以基本上 5 次出现的星星替换为 4 次出现的星星。我该怎么做 在正则表达式 javascript.

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

我试过了,但不确定如何替换捕获组:

console.log("Hello ***** World".replace(/[a-zA-Z](.*)/gm,"||"));

更新:

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

我的数据是这样的:

1.  Hello


•   World

我需要这个

1.  Hello

•   World

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

[Numeric].[Space][Any text]

and

•[Three Spaces][AnyText]

反之亦然

•[Three Spaces][AnyText]

and 

[Numeric].[Space][Any text]

注意:抱歉解释不当。我是正则表达式的菜鸟。

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

console.log("Hello ***** World".replace(/(\*+)\*/g, ""));

参见regex demo

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

console.log("Hello ***** World".replace(/(\*)\*(?!\*)/g, ''));
console.log("Hello ***** World".replace(/(?<=\*)\*(?!\*)/g, ''));

参见 this regex demo #2 and regex demo #3

(\*)\*(?!\*) 中,第一个 * 被捕获到第 1 组,然后匹配右侧没有其他星号的星号,并且替换 </code>与第一个解决方案中的工作一样。</p> <p><code>(?<=\*)\*(?!\*) 正则表达式只匹配左边有星号而右边没有星号的任何星号(这就是替换模式为空的原因)。

将此应用于减少两个字符串之间的换行符数量问题可能类似于

text = text.replace(/(\d+\.\s.*(?:\r\n?|\n)+)(?:\r\n?|\n)(?=•\s{3})/g, '').replace(/(•\s{3}.*(?:\r\n?|\n)+)(?:\r\n?|\n)(?=\d+\.\s)/g, '')

参见 this demo and another, "vice versa", demo

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