【问题标题】:Regex mask replacement pattern for Phonenumber电话号码的正则表达式掩码替换模式
【发布时间】:2016-04-14 17:34:06
【问题描述】:

我是正则表达式的新手 我的电话号码正则表达式模式为 (?\d{3})?-? *\d{3}-? *-?\d{4}

我正在尝试屏蔽电话号码以仅显示最后 4 位数字。

我正在使用函数 Regex.Replace("(123) 556-7890 ", "(?\d{3})?-? *\d{3}-? *-?\d{4}" , "#")

有人能帮我什么是替换模式吗?

我需要像 for 一样输出。输入可以是 XML 或 JSON

输入
电话号码> (123) 556-7890 电话号码>

输出 电话号码>(XXX) XXX-7890 电话号码>

输入
电话号码> 123 556 7890 电话号码>

输出 电话号码>XXX XXX 7890 电话号码>

输入
电话号码> (123) 556- 7890 电话号码>

输出 电话号码>(XXX) XXX- 7890 电话号码>

【问题讨论】:

    标签: c# .net regex


    【解决方案1】:

    您可以使用正则表达式匹配字符串末尾最后 4 位以外的任何数字,并替换为 X

    \d(?!\d{0,3}$)
    

    解释

    • \d - 匹配一个数字并...
    • (?!\d{0,3}$) - 如果字符串末尾有 0 到 3 位数字,则匹配失败。

    查看regex demo 和此C# demo

    var data = new string[] {"(123) 556-7890", "123 556 7890", "(123) 556- 7890"};
    foreach (var s in data) {
        Console.WriteLine(Regex.Replace(s, @"\d(?!\d{0,3}$)", "X"));
    

    结果:

    (XXX) XXX-7890
    XXX XXX 7890
    (XXX) XXX- 7890
    

    更新显示如何将您的正则表达式与我的结合使用

    您只需要使用您的正则表达式来匹配所需格式的电话号码,并使用我的来掩盖匹配评估器中的数字:

    var data = "I have this (123) 556-7890 phone number, followed with 123 556 7890, and (123) 556- 7890.";
    var res = Regex.Replace(data, @"\(?\d{3}\)?-? *\d{3}-? *-?\d{4}", 
                    x => Regex.Replace(x.Value, @"\d(?!\d{0,3}$)", "X"));
    Console.WriteLine(res);
    

    IDEONE demo

    注意 @"\(?\d{3}\)?-? *\d{3}-? *-?\d{4}\b"@"\(?\d{3}\)?-? *\d{3}-? *-?\d{4}(?!\d)" 可能是提取电话号码的更好模式,因为最后 4 位数字后面不能跟单词/非数字字符。

    【讨论】:

    • 如果输入为“(123) 556-7890”,则此输入不起作用,预期输出为 (XXX) XXX-8769
    • 不要直接替换 XML。使用适当的工具对其进行解析,然后仅替换纯文本。但你当然可以用< 甚至</PhoneNumber> 替换$
    • @Tim007 如果输入包含多个电话号码,OP 所需要的只是使用电话提取正则表达式并用此正则表达式替换数字。
    • @user3681378:我将重复一遍:使用适当的工具解析 JSON/XML,并仅替换必填字段。否则,您可能会匹配您不需要的内容而无法匹配您需要的内容。
    • 你能帮我做一下XX543252XX的正则表达式吗?
    【解决方案2】:

    如果总是相同的位数,是否需要替换?肯定只取最后四位数字并将(XXX) XXX- 放在它前面会达到相同的结果吗?

    string masked = "(XXX) XXX-" + input.Substring(input.Length - 4);
    

    显然,您仍应首先使用原始正则表达式来确保它是有效的电话号码。

    【讨论】:

    • no flynn 我不能这样做,因为它是一个通用功能,应该适用于基于模式的 SSN 等
    【解决方案3】:

    难道你不能简单地用\d{4}$ 保存最新的 4 位数字,然后模拟以前的代码吗? :)

    【讨论】:

    • var replaceString = Regex.Replace("(754) 765-8769", "(?\d{3})?-? *\d{3}- ? *-?\d{4}", "###-##-\d{4}$");结果是 ###-##-\d{4}$
    • 正则表达式:([\(?(\d{0,3})\)?\s]+[-\s])(?=\d{4}) 替换:XXX-XXX-
    • 更好([\(?(\d{0,3})\)?\s]+[-\s]+)
    【解决方案4】:

    试试这个

    (\d)([() -]*)(\d)([() -]*)(\d)([() -]*)(\d)([() -]*)(\d)([() -]*)(\d)([() -]*)(\d+)
    

    替换

    x\2x\4x\6x\8x\10x\12\13
    

    Regex demo

    输入

    Input
    PhoneNumber> (123) 556-7890 PhoneNumber>
    
    Output PhoneNumber>(XXX) XXX-7890 PhoneNumber>
    
    Input
    PhoneNumber> 123 556 7890 PhoneNumber>
    
    Output PhoneNumber>XXX XXX 7890 PhoneNumber>
    
    Input
    PhoneNumber> (123) 556- 7890 PhoneNumber>
    
    Output PhoneNumber>(XXX) XXX- 7890 PhoneNumber>
    

    输出

    Input
    PhoneNumber> (xxx) xxx-7890 PhoneNumber>
    
    Output PhoneNumber>(XXX) XXX-7890 PhoneNumber>
    
    Input
    PhoneNumber> xxx xxx 7890 PhoneNumber>
    
    Output PhoneNumber>XXX XXX 7890 PhoneNumber>
    
    Input
    PhoneNumber> (xxx) xxx- 7890 PhoneNumber>
    
    Output PhoneNumber>(XXX) XXX- 7890 PhoneNumber>
    

    【讨论】:

    • Regex.Replace(" (123) 556-7890 ", @"(\d)([() -]*)(\d)([() -]*)(\d)([() -]*)(\d)([() -]*)(\d)([() -]*)(\d)([() -] *)(\d+)", "x\\2x\\4x\\6x\\8x\\10x\\12\\13") 结果是 (x\2x\4x\6x\8x\10x \12\13
    【解决方案5】:

    嘿,检查此函数,只需将您要屏蔽的电话号码作为函数的输入,它将返回您屏蔽的字符串

    function maskPhoneNumber(phoneNumber) {
    
    	var regularExpresion = /\(?\d{3}\)?-? *\d{3}-? *-?\d{4}/g, // regular expression to test phone numbers
    		stringArray,
    		maskString,
    		lastString;
    	
    	// Check if given input matches the phone number pattern
    	if(regularExpresion.test(phoneNumber)) {
    		
    		// split phone number to an array of characters to manipulate string
    		stringArray = phoneNumber.split("");
    
    		/* 
    		 * splice the array after reversing so that last 4 digits are seperated
    		 * Now stringArray will have last 4 digits and maskString will have remaining characters
    		 *
    		 */
    		maskString = stringArray.reverse().splice(4);
    
    		// reverse and join the array to get last 4 digits without any change
    		lastString = stringArray.reverse().join("");
    
    		// now replace the remaining characters where digits are present with "X" and then join the array
    		// concat masked string with last 4 digits to get the required format
    		phoneNumber = maskString.reverse().join("").replace(/\d/g,"X") + lastString;
    	}
    
    	return phoneNumber;
    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-15
      • 2017-09-23
      • 2014-02-15
      • 1970-01-01
      相关资源
      最近更新 更多