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# - 使用正则表达式验证电话号码的主要内容,如果未能解决你的问题,请参考以下文章

C#中正则表达式的使用

学习 正则表达式 js java c# python 通用

手机号码正则表达式验证

使用正则表达式验证瑞典电话号码

正则表达式手机号验证问题 急~~~

js正则表达式电话号码验证