-3

如何在名字、中间名和姓氏中进行屏蔽?根据名称中每个单词中的字母数进行屏蔽。条件下:

  • 如果有3-4字母,则最后两个字母将被屏蔽。
  • 如果有多个4字母,则不屏蔽第一个 2字母和最后一个字母。 1

例子:

  1. "Jo Dyne Roger" --> "Jo Dy** Ro**r"
  2. "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#中实现相同的功能

4

1 回答 1

1

让我们一步一步实现,从屏蔽单个名称开始:

如果有 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
于 2020-03-11T07:18:30.073 回答