我尝试用一个函数将一定长度的字符后的所有字符替换为星号,到目前为止,我所做的就是这样。
var text = 'ABCDEFG';
var newText = text.substring(0,3) + text.substring(3).replace(/\S/g,'*');
如果能给我我需要的东西,但是我理解它是相当低效的,我试图改变它以使其更有效率。
text.replace(/.{4}$/,'*');
不幸的是结果不是我预期的,而且还需要硬编码从后面开始计算4的长度,如果单词的长度不同,它将无法工作。
是否有任何正则表达式方法能够在一定长度的字符后将所有其他字符替换为星号(在本例中为3)。
对此有任何帮助将不胜感激。感谢。
编辑: 作为建议和讨论的结论
解决问题的替代方法,它提供与我的解决方案几乎相同的结果。
text.replace(/(\w{3}).*/g, "$1"+(new Array(text.length -3 + 1).join( '*' )));
by @Keerthana Prabhakaran
text.replace(new RegExp(".(?=.{0," + (text.length-4) + "}$)", "g"), '*')
by@WiktorStribiżew
var longerThanNeeded = "***************************";
var newText = text.substring(0,3) + longerThanNeeded.substring(0,text.length-3);
by @matthewninja
(^.{3}).|. and replace w/ \1*
by @alpha bravo
与一些人讨论,由于代码的效率几乎相同,即使对于我制作的原始代码也是如此。因此它表示正在讨论。
再次感谢你的帮助。
答案 0 :(得分:3)
我希望我不要过分思考这个问题。
text.substring(3).replace(/\S/g,'*');
具有线性时间复杂度O(n)
,并且效率非常低。
我最初想过如此使用Array.prototype.join()
:
var newText = text.substring(0,3) + Array(text.length-2).join("*");
在意识到.join()需要为数组的每个元素运行时,这会导致线性时间复杂度,就像您的原始解决方案一样。这根本不会改善解决方案;我所做的一切都是为了扩大空间复杂性。
然后我继续考虑通过复制和增加先前元素的大小来创建要连接的元素,这将使我们降低0(log n)
复杂度。
最后,我看到了最明显的解决方案。
var longerThanNeeded = "***************************";
var newText = text.substring(0,3) + longerThanNeeded.substring(0,text.length-3);
将在恒定时间内运行。
答案 1 :(得分:2)
您可以使用此模式(^.{3}).|.
并替换w / \1*
Demo
(请注意长度小于3个字符的字符串的限制)
( # Capturing Group (1)
^ # Start of string/line
. # Any character except line break
{3} # (repeated {3} times)
) # End of Capturing Group (1)
. # Any character except line break
| # OR
. # Any character except line break
答案 2 :(得分:1)
您可以使用
s.replace(new RegExp(".(?=.{0," + (s.length-4) + "}$)", "g"), '*')
参见JS演示:
var text = 'ABCDEFG';
var threshold = 3; // Start replacing with * after this value
if (text.length > threshold) {
text = text.replace(new RegExp(".(?=.{0," + (text.length-threshold-1) + "}$)", "g"), '*');
}
console.log(text);

此处,如果threshold
为3
,则模式将显示为.(?=.{0,3}$)
:它匹配任何字符,但与.
的换行符匹配,后跟0到除了换行符(.{0,3}
)和字符串位置($
)之外的3个字符。 (?=...)
是一个积极的先行,只检查模式匹配,但不移动正则表达式索引,也不会将匹配的文本添加到匹配值(允许后续的连续符号检查)。
要启用匹配的换行符,请将.
替换为[^]
或[\s\S]
。