[英]Replacing character after certain character length
我试图做一个函数来将一定长度的字符后的所有字符替换为星号,到目前为止我所做的就是这样。
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( '*' )));
由@Keerthana Prabhakaran提供
text.replace(new RegExp(".(?=.{0," + (text.length-4) + "}$)", "g"), '*')
由@WiktorStribiżew撰写
var longerThanNeeded = "***************************";
var newText = text.substring(0,3) + longerThanNeeded.substring(0,text.length-3);
通过@matthewninja
(^.{3}).|. and replace w/ \1*
来自@alpha bravo
正如与一些人讨论的那样,由于代码的效率几乎与我制作的原始代码相同。 因此,它表示正在讨论。
再次感谢你的帮助。
我希望我不要过分思考这一点。
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);
这将在恒定的时间运行。
您可以使用此模式(^.{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
你可以用
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}$)
:它匹配任何char,但是使用换行符.
接下来是除了换行符( .{0,3}
)之外的0到3个字符以及字符串位置( $
)的结尾。 (?=...)
是一个正向前瞻,只检查模式匹配,但不移动正则表达式索引,并且不将匹配的文本添加到匹配值(允许后续的连续符号检查)。
要启用匹配的换行符,请替换.
用[^]
或[\\s\\S]
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.