C# - 使用正则表达式验证电话号码
Posted
技术标签:
【中文标题】C# - 使用正则表达式验证电话号码【英文标题】:C# - Validating phone numbers using regex 【发布时间】:2021-12-15 03:56:17 【问题描述】:编辑:我解决了以下任务,但我遇到了一些问题。
任务:编写一个程序,从文本中选择正确格式的电话号码,如果匹配正则表达式,则分别列出与正则表达式的整个匹配项、国家代码和电话号码。正确的格式为:+xxx xxx xxx xxx, (xxx) xxx xxx xxx, xxx xxx xxx, xxxxxxxxx, +xxxxxxxxxxxx。我需要这个任务#C .NET 4.7.2。感谢您的帮助。
我有这个代码:
using System.Linq;
using System.Text.RegularExpressions;
public class Program
private static string MakeRegex(params string[] patterns)
string SinglePattern(string pattern) => "(?:^" + string.Concat(Regex
.Split(pattern, "(x+)")
.Select(item => item.StartsWith('x')
? $"[0-9]item.Length"
: string.Concat(item.Select(c => Regex.Escape(c.ToString()))))) + "$)";
return string.Join("|", patterns.Select(pattern => SinglePattern(pattern)));
public static void Main()
string Patterns = MakeRegex(
"+xxx xxx xxx xxx",
"(xxx) xxx xxx xxx",
"xxx xxx xxx",
"xxxxxxxxx",
"+xxxxxxxxxxxx"
);
string[] PhoneNumbers = new string[]
"+420 000 111 222",
"(420) 000 111 222",
"111 000 222",
"000111222",
"+420000111222",
"000111",
"+(420) 000 111 222"
;
string numbers = string.Join(Environment.NewLine, PhoneNumbers
.Select(test => $"test,20 : (Regex.IsMatch(test, Patterns) ? "Matched" : "No")"));
string[] ns = numbers.Split('\n');
foreach (var n in ns)
Console.WriteLine(n);
【问题讨论】:
你可以在这里查看相同问题的答案***.com/questions/18091324/… 【参考方案1】:拥有一个集合类似的模式
+xxx xxx xxx xxx,
(xxx) xxx xxx xxx,
xxx xxx xxx,
xxxxxxxxx,
+xxxxxxxxxxxx
我们可以借助正则表达式和Linq将它们组合成一个正则表达式:
using System.Linq;
using System.Text.RegularExpressions;
...
private static string MakeRegex(params string[] patterns)
static string SinglePattern(string pattern) => "(?:^" + string.Concat(Regex
.Split(pattern, "(x+)")
.Select(item => item.StartsWith('x')
? $"[0-9]item.Length"
: string.Concat(item.Select(c => Regex.Escape(c.ToString()))))) + "$)";
return string.Join("|", patterns.Select(pattern => SinglePattern(pattern)));
用法
string phonePattern = MakeRegex(
// Add / Edit / Remove patterns, if required
"+xxx xxx xxx xxx",
"(xxx) xxx xxx xxx",
"xxx xxx xxx",
"xxxxxxxxx",
"+xxxxxxxxxxxx"
);
...
if (Regex.IsMatch(pnumber, phonePattern))
...
演示:
string phonePattern = MakeRegex(
"+xxx xxx xxx xxx",
"(xxx) xxx xxx xxx",
"xxx xxx xxx",
"xxxxxxxxx",
"+xxxxxxxxxxxx"
);
string[] tests = new string[]
//TODO: Add more tests here
"+123 456 789 777",
"(123) 456 789 444",
"123 456 789",
"123456789",
"+123456789567",
"12345678",
"1234567899",
"1234 56 789",
"123456789", // Expected "Matched" (see comments below)
"670 230 465", // Expected "Matched" (see comments below)
"2736896", // Expected "No" (see comments below)
"593683", // Expected "No" (see comments below)
;
string report = string.Join(Environment.NewLine, tests
.Select(test => $"test,20 : (Regex.IsMatch(test, phonePattern) ? "Matched" : "No")"));
Console.Write(report);
结果:
+123 456 789 777 : Matched
(123) 456 789 444 : Matched
123 456 789 : Matched
123456789 : Matched
+123456789567 : Matched
12345678 : No
1234567899 : No
1234 56 789 : No
123456789 : Matched
670 230 465 : Matched
2736896 : No
593683 : No
请fiddle你自己
【讨论】:
所以应该是这样的,对吗?使用系统;使用 System.Text.RegularExpressions; static void Main() string pnumber = "123456789"; string phonePattern = MakeRegex("+xxx xxx xxx xxx", "(xxx) xxx xxx xxx", "xxx xxx xxx", "xxxxxxxxx", "+xxxxxxxxxxxx"); if (Regex.IsMatch(pnumber, phonePattern)) Console.WriteLine("Correct"); @Alb43:是的,像这样。我们可以在MakeRegex
的帮助下构建它,而不是实现phonePattern
手动
我的代码在以前的消息中出了什么问题,它不起作用。感谢您的帮助
@Alb43: 你能提供反例 - 当预期结果并不代表实际结果时的测试用例?
dotnetfiddle.net/siOj5W 玩代码以上是关于C# - 使用正则表达式验证电话号码的主要内容,如果未能解决你的问题,请参考以下文章