javascript正则表达式:我想替换变量的最后4个字

wpcxdonn  于 2021-07-14  发布在  Java
关注(0)|答案(2)|浏览(242)

我目前正在用spring、java和javascript制作一个电子商务网站。我想在用户注册这样的问题时隐藏最后四个单词
hello123>>地狱堆栈溢出>>堆栈溢出
这是我在jsp中编写的代码。

<table>
<td id="userId">${ qna.userId }</td>
</table>

<script>
var userId = document.getElementById("userId");

    function maskingNumbers(userId) {
           return userId.replace(/\d(?=\d{4})/g, "*");
         }
</script>

好吧,我的“userid”仍然以原始形式打印出来。如果你能具体说明步骤的话,我会非常感激的。

vyu0f0g1

vyu0f0g11#

你要求替换“单词”,因为你的例子似乎显示了“字符”的替换,这更容易。正如@johannesh所指出的,正则表达式似乎以数字为目标。
试试这个表达式

userId.replace(/\w{4}$/g, "****")

正则表达式 \w{4}$ 以最后四个单词字符为目标(表示数字或字母或 _ )在输入中
再考虑一下再编辑
如果最后4个字符中有空格或符号,我给你的答案将失败。你宁愿用 . ,表示任何字符

userId.replace(/.{4}$/g, "****")

你必须处理输入少于4个字符的情况。。。
请在此处尝试:https://regex101.com/r/hyxup1/2
多思考后再编辑
你的问题表面上看起来很简单,但在试图彻底回答的时候需要更多。感谢其他用户的评论。我犹豫着给出第二个答案:
正如我指出的,您还应该考虑输入中有4个或更少字符的情况。你可能会得到非常复杂的代码。。。或者使用下面的解决方案(后面解释)

function maskInput(input) {
    return input.replace(/(.?)(.{1,4})$/g, '$1****').substr(0, input.length);
}

正则表达式 (.?)(.{1,4})$ 将在结尾最多匹配4个字符,前面有1个其他字符(可选)。前面的这个字符将在第1组(第一组括号)中捕获。在这里测试https://regex101.com/r/hyxup1/3
替换者将吐出第一个捕获的组( $1 )然后用4颗星代替所有匹配的字符(保持开头不变)。但是,如果字符串短于5个字符,则这将导致结果太长,只有几颗星。
因此,我们使用原始字符串的length with方法在结果变得太长之前剪切掉它 String.substr ```
const inputs = [
'Find the last 4 chars in this sentence',
'Stackoverflow',
'I'm a smart monk3y',
'I'm a dumb m0nk@y',
'6chars',
'5chrs',
'4crs',
'3cr',
'2c',
'1',
];

function maskInput(input) {
return input.replace(/(.?)(.{1,4})$/g, '$1****').substr(0, input.length);
}

inputs.forEach(input => console.log(input, '->', maskInput(input)));

628mspwn

628mspwn2#

使用string.replace()方法和regex可以更改输入字符串的最后4个字符。
正则表达式看起来是这样的:

/.{4}$/g

其他想法:当输入短语长度小于或正好是四个字符时,您必须决定要做什么。如果您像下面的代码片段那样操作,则少于四个字符的字符串将不会更改。

let userID = "stackoverflow";
console.log("input: " + userID);

function maskingNumbers(e) {
    return e.replace(/.{4}$/g, "****");
}

console.log("result: " + maskingNumbers(userID));

点击这里的js小提琴

相关问题