一尘不染

如何在C#中读取RegEx捕获

c#

我开始读一本C#书,然后决定将RegEx放进书中,以使无聊的控制台练习更加有趣。我想要做的是在控制台中向用户询问他们的电话号码,对照RegEx进行检查,然后捕获数字,以便我可以按照自己的方式格式化它们。除了RegEx捕获部分,我已经完成所有工作。如何将捕获值转换为C#变量?

也可以随时纠正任何代码格式或变量命名问题。

static void askPhoneNumber()
{
    String pattern = @"[(]?(\d{3})[)]?[ -.]?(\d{3})[ -.]?(\d{4})";

    System.Console.WriteLine("What is your phone number?");
    String phoneNumber = Console.ReadLine();

    while (!Regex.IsMatch(phoneNumber, pattern))
    {
        Console.WriteLine("Bad Input");
        phoneNumber = Console.ReadLine();
    }

    Match match = Regex.Match(phoneNumber, pattern);
    Capture capture = match.Groups.Captures;

    System.Console.WriteLine(capture[1].Value + "-" + capture[2].Value + "-" + capture[3].Value);
}

阅读 383

收藏
2020-05-19

共1个答案

一尘不染

C#regex API可能会令人困惑。有 小组捕获

  • 表示捕获组,它用于从文本中提取的子串
  • 如果该组出现在量词中,则每个组可以有多个 捕获

层次结构是:

  • 比赛
    • 捕获

(一场比赛可以有多个小组,每个小组可以有多个比赛)

例如:

Subject: aabcabbc
Pattern: ^(?:(a+b+)c)+$

在此示例中,只有一个组:(a+b+)。该组在量词内部,并且匹配两次。它生成两个 捕获aababb

aabcabbc
^^^ ^^^
Cap1  Cap2

当一组不在量词内部时,它仅生成一个捕获。在您的情况下,您有3个组,每个组捕获一次。您可以使用match.Groups[1].Valuematch.Groups[2].Valuematch.Groups[3].Value提取你感兴趣的子串3,而不诉诸
捕捉 所有概念。

2020-05-19