【问题标题】:How to replace (n) occurrences of a character with (n-1) occurrences of the same character in JavaScript Regex如何在 JavaScript 正则表达式中用 (n-1) 次出现的相同字符替换 (n) 次出现的字符
【发布时间】:2021-11-27 12:59:27
【问题描述】:

我的数据是

Hello ***** World

我需要

Hello **** World

所以基本上 5 次出现的明星被 4 次出现的明星取代。我该如何在正则表达式 javascript 中做到这一点。

注意:星数是动态的。

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

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

更新:

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

我的数据是这样的:

1.  Hello


•   World

我需要这个

1.  Hello

•   World

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

[Numeric].[Space][Any text]

and

•[Three Spaces][AnyText]

反之亦然

•[Three Spaces][AnyText]

and 

[Numeric].[Space][Any text]

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

【问题讨论】:

  • 您将他的答案中的\* 更改为空格。 /( +) /(或*,而不是+)如果您还想删除最后一个空格。

标签: javascript regex string replace


【解决方案1】:

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

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

请参阅regex demo

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

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

请参阅 this regex demo #2regex demo #3

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

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

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

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

参见this demoanother, "vice versa", demo

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

【讨论】:

  • 如果您想允许删除最后一个星号,请将 /(\*+)\*/g 更改为 /(\**)\*/g
  • @3limin4t0r 我认为不需要删除独立的星号。我理解必须处理两个或多个星号序列。
  • 我稍微编辑了这个问题。我试图将您的解决方案翻译成我的,但不确定如何将其翻译成我的实际问题。你能帮我解决这个问题吗?对不起,我是正则表达式的菜鸟。
猜你喜欢
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多