我的数据是
Hello ***** World
I need
Hello **** World
所以基本上 5 次出现的星号被替换为 4 次出现的星号。我怎样才能做到这一点在正则表达式javascript中。
注意:星星的数量是动态的。
我尝试过此操作,但不确定如何替换捕获组:
console.log("Hello ***** World".replace(/[a-zA-Z](.*)/gm,"$1||$3"));
UPDATE:
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]
注意:抱歉解释不好。我是正则表达式新手。
您可以捕获一个或多个星号,然后进行匹配而不捕获另一个(序列中的最后一个)星号,并替换为对组值的反向引用:
console.log("Hello ***** World".replace(/(\*+)\*/g, "$1"));
See the 正则表达式演示.
这里还有其他类似的解决方案:
console.log("Hello ***** World".replace(/(\*)\*(?!\*)/g, '$1'));
console.log("Hello ***** World".replace(/(?<=\*)\*(?!\*)/g, ''));
See 这个正则表达式演示 #2 and 正则表达式演示 #3.
In (\*)\*(?!\*)
, 首先*
被捕获到组 1 中,然后匹配其右侧没有其他星号的星号,并且$1
替换的作用与第一个解决方案相同。
The (?<=\*)\*(?!\*)
正则表达式仅匹配左侧紧邻星号且右侧紧邻没有星号的任何星号(这就是替换模式为空的原因)。
将此应用到减少两个字符串之间的换行符数量问题可能看起来像
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')
See 这个演示 and 另一个,“反之亦然”,演示.
Here, (?:\r\n?|\n)
取代了\*
模式并匹配 CRLF、LF 或 CR 行结尾。\s{3}
匹配任意三个空格字符。\d+\.\s
匹配一位或多位数字,.
和一个空格,以及.*
匹配除换行符之外的任何零个或多个字符,尽可能多(行模式的其余部分)。前瞻,(?=...)
,用于确保匹配连续的匹配项。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)