【问题标题】:format ssn using regex使用正则表达式格式化 ssn
【发布时间】:2011-03-10 00:43:20
【问题描述】:

您好,我需要 c sharp 中的正则表达式以 xxx-xx-6789 的格式显示 SSN。即 123456789 应在文本字段中显示为 xxx-xx-6789。我现在使用的代码是

string SSN = "123456789";
Regex ssnRegex = new Regex("(?:[0-9]{3})(?:[0-9]{2})(?:[0-9]{4})");
string formattedSSN = ssnRegex.Replace(SSN, "XXX-XX-${last}");

屏蔽 ssn xxx-xx-6789 的正确 Reg 表达式是什么?

【问题讨论】:

  • 字符串格式化SSN = "XXX-XX-" + SSN.Substring(SSN.Length - 4, 4);

标签: c# asp.net regex


【解决方案1】:

您在替换字符串中使用last 作为命名组,而没有在模式中指定它。

如下更新您的模式,您现有的代码应该可以工作:

(?:[0-9]{3})(?:[0-9]{2})(?<last>[0-9]{4})

根据您的输入,您可能希望通过使用^$ 元字符分别匹配字符串的开头和结尾来限制模式以匹配整个输入。通过这样做,正则表达式不会匹配超过 9 个连续数字的输入。这看起来像:

^(?:[0-9]{3})(?:[0-9]{2})(?<last>[0-9]{4})$

另外,由于您只关心最后 4 位数字,您可以选择匹配 5 个数字,然后是 4 个数字,而不是将其分成 3 组:

^(?:[0-9]{5})(?<last>[0-9]{4})$

此外,如果您的输入始终是 9 个数字并且可以信任,则不需要正则表达式。您可以简单地获取子字符串以提取最后 4 个字符:

string SSN = "123456789";
string formattedSSN = "XXX-XX-" + SSN.Substring(SSN.Length - 4, 4);

【讨论】:

    【解决方案2】:

    SSN 屏蔽的通用代码。

        string originalSSN = Convert.ToString("123-456-789").PadLeft(9, '0');
            int maskDigit = 6;
            string maskSSN = originalSSN.Substring(originalSSN.Length - maskDigit, maskDigit);            
            if (Regex.IsMatch(maskSSN, "(—)|(–)|(-)"))
            {
                int i = maskDigit;
                while (Regex.Replace(maskSSN, "(—)|(–)|(-)", "").Length < maskDigit)
                {
                    i++;
                    maskSSN = originalSSN.Substring(originalSSN.Length - i, i);
                }
    
                string[] ssnArray = Regex.Split(maskSSN, "(—)|(–)|(-)", RegexOptions.ExplicitCapture);
                if (ssnArray.Length > 1)
                {
                    maskSSN = originalSSN.Substring(originalSSN.Length - maskDigit - (ssnArray.Length - 1), maskDigit + (ssnArray.Length - 1));
                }
    
            }
    
    
            maskSSN = maskSSN.PadLeft(9, '#');
    

    【讨论】:

      【解决方案3】:

      这个很好的小功能怎么样,它可以屏蔽 Tins 和 Ssns:

      public static string MaskSSN(string originalSSN)
          {
              if (originalSSN.Length < 5) return originalSSN;
              var trailingNumbers = originalSSN.Substring(originalSSN.Length - 4);
              var leadingNumbers = originalSSN.Substring(0, originalSSN.Length - 4);
              var maskedLeadingNumbers = Regex.Replace(leadingNumbers, @"[0-9]", "X");
              return maskedLeadingNumbers + trailingNumbers;
          }
      

      所以“123-45-6789”变成了“XXX-XX-6789” “12-1234567”变成“XX-XXX4567”。

      【讨论】:

        【解决方案4】:
        string originalSSN = Convert.ToString("123-456-789").PadLeft(9, '0');
        int maskDigit = 6;
        string maskSSN = originalSSN.Substring(originalSSN.Length - maskDigit, maskDigit);            
        if (Regex.IsMatch(maskSSN, "(—)|(–)|(-)")) {
            int i = maskDigit;
            while (Regex.Replace(maskSSN, "(—)|(–)|(-)", "").Length < maskDigit) {
                i++;
                maskSSN = originalSSN.Substring(originalSSN.Length - i, i);
            }
        
            string[] ssnArray = Regex.Split(maskSSN, "(—)|(–)|(-)", RegexOptions.ExplicitCapture);
            if (ssnArray.Length > 1) {
                maskSSN = originalSSN.Substring(originalSSN.Length - maskDigit - (ssnArray.Length - 1), maskDigit + (ssnArray.Length - 1));
            }
        }
        
        maskSSN = maskSSN.PadLeft(9, '#');
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-10-04
          • 2019-09-15
          • 2020-09-14
          • 1970-01-01
          • 1970-01-01
          • 2023-02-04
          相关资源
          最近更新 更多