c# - 在 C# 中屏蔽基于名称的长度
问题描述
如何在名字、中间名和姓氏中进行屏蔽?根据名称中每个单词中的字母数进行屏蔽。条件下:
- 如果有
3-4
字母,则最后两个字母将被屏蔽。 - 如果有多个
4
字母,则不屏蔽第一个2
字母和最后一个字母。1
例子:
"Jo Dyne Roger" --> "Jo Dy** Ro**r"
"Samantha Summer" --> "Sa*****a Su***r"
在javascript中,我使用以下代码:
var name ="Jo Dyne Roger";
var regex1 =/\b(\w{1,2})(\w{2,}?)(\w?)\b/g;
var regex2 =/\b(\w{3})(\w+)(\w)\b/g;
console.log(name.replace(
regex1,
(_, first, middle, last) => `${first}${'*'.repeat(middle.length)}${last}`).replace(
regex2,
(_, first, middle, last) => `${first}${'*'.repeat(middle.length)}${last}`));
我不明白如何在C#中实现相同的功能
解决方案
让我们一步一步实现,从屏蔽单个名称开始:
如果有 3-4 个字母,那么最后两个字母将被屏蔽。如果超过 4 个字母,前 2 个字母和后 1 个字母不被屏蔽
private static string MyMask(string value) {
if (string.IsNullOrEmpty(value) || value.Length < 3)
return value;
else if (value.Length <= 4)
return value.Substring(0, 2) +
new string('*', value.Length - 2);
else
return value.Substring(0, 2) +
new string('*', value.Length - 3) +
value.Substring(value.Length - 1);
}
有了掩码,我们可以写一个简单的正则表达式:我们想要的只是将Replace
带有3
字母或更多字母的单词变成对应的MyMask
string source = "Jo Dyne Roger";
string result = Regex.Replace(source, @"\b\w{3,}\b", match => MyMask(match.Value));
演示:
string[] tests = new string[] {
"Jo Dyne Roger",
"Samantha Summer",
};
string report = string.Join(Environment.NewLine, tests
.Select(test => $"{test} --> {Regex.Replace(test, @"\b\w{3,}\b", match => MyMask(match.Value))}")
);
Console.Write(report);
结果:
Jo Dyne Roger --> Jo Dy** Ro**r
Samantha Summer --> Sa*****a Su***r
推荐阅读
- python - 如何定义多种用途的字典?
- mysql - 从表限制中查找员工参加会议的次数
- google-chrome-extension - 将扩展迁移到清单 v3
- amazon-ecs - 如何使用 ECR 编辑 Caddyfile
- python - 为什么是我的鼠标射击而不是我的播放器?
- r - 使用 R 和 Rvest 抓取网页时出现问题
- reactjs - 在 github 页面上部署 react 应用程序时,我遇到了错误-请确保您具有正确的访问权限并且存储库存在
- applescript - 有没有办法将变量存储在 Applescript 库中?
- swift - VC中动态改变背景颜色
- javascript - 谷歌日历 API 路径