Phonenumber的正则表达式掩码替换模式

时间:2016-04-14 17:34:07

标签: c# .net regex

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

我试图屏蔽电话号码,只显示最后4位数字。

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

有人会帮助我替换模式。

我需要出类似的。输入可以是XML或JSON

输入
******中国> (123)556-7890 PhoneNumber>

输出 PhoneNumber>(XXX)XXX-7890 PhoneNumber>

输入
******中国> 123 556 7890 PhoneNumber>

输出 PhoneNumber> XXX XXX 7890 PhoneNumber>

输入
******中国> (123)556-7890 PhoneNumber>

输出 PhoneNumber>(XXX)XXX- 7890 PhoneNumber>

5 个答案:

答案 0 :(得分:5)

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

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

Explantion

  • \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位数字后面不能包含字/非数字字符。

答案 1 :(得分:2)

试试这个

(\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>

答案 2 :(得分:2)

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

答案 3 :(得分:1)

如果它的数字位数始终相同,您是否需要更换?当然只是取了最后四位数并将(XXX) XXX-放在它前面会得到相同的结果吗?

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

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

答案 4 :(得分:1)

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

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;
}