我开始读一本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); }
C#regex API可能会令人困惑。有 小组 和 捕获 :
层次结构是:
(一场比赛可以有多个小组,每个小组可以有多个比赛)
例如:
Subject: aabcabbc Pattern: ^(?:(a+b+)c)+$
在此示例中,只有一个组:(a+b+)。该组在量词内部,并且匹配两次。它生成两个 捕获 :aab和abb:
(a+b+)
aab
abb
aabcabbc ^^^ ^^^ Cap1 Cap2
当一组不在量词内部时,它仅生成一个捕获。在您的情况下,您有3个组,每个组捕获一次。您可以使用match.Groups[1].Value,match.Groups[2].Value并match.Groups[3].Value提取你感兴趣的子串3,而不诉诸 捕捉 所有概念。
match.Groups[1].Value
match.Groups[2].Value
match.Groups[3].Value