如何在 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
匹配一个或多个数字,.
和一个空格,.*
匹配除换行符以外的任何零个或多个字符,尽可能多(行模式的其余部分) .前瞻 (?=...)
用于确保匹配连续的匹配项。
我的数据是
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
匹配一个或多个数字,.
和一个空格,.*
匹配除换行符以外的任何零个或多个字符,尽可能多(行模式的其余部分) .前瞻 (?=...)
用于确保匹配连续的匹配项。