如何在 C# 正则表达式 switch/case 中使用命名组?

How can I use named group in C# regex switch/case?

我想编写一个代码来检查它是否与正则表达式匹配,然后打印匹配的字符串。

我发现了其他问题 ,但是 IsMatch 方法只有 returns 布尔值,所以我无法检索命名组字符串。

var filepath = @"path/to/file.txt";
foreach (string line File.ReadLines(filepath))
{
    switch (line)
    {
        case var s when new Regex(@"^(?<UserName>\w+) moved to (?<Position>\w+)$").IsMatch(s):
            // I have to know <UserName> and <Position> here.
            break;
        ...
    }
}

您可以使用组获取值:

var regex = new Regex(@"^(?<UserName>\w+) moved to (?<Position>\w+)$");
var match = regex.Match(blobContent);
if (match.Success)
{
   string userName= m.Groups["UserName"].Value;
   string position= m.Groups["Position"].Value;
}            

首先,我建议将 regex 结构本身移到 switch 块之外 - 既为了可读性又为了允许它被重用。

然后,不使用 IsMatch,而是使用 Match 到 return a Match,然后检查是否成功(可能使用 C# 模式比赛)。例如:

using System.Text.RegularExpressions;

class Program
{
    private static void Main()
    {
        RunTest("Jon moved to XYZ");
        RunTest("Not a match");
    }

    private static readonly Regex UserMovementRegex = new Regex(@"^(?<UserName>\w+) moved to (?<Position>\w+)$");
    private static void RunTest(string line)
    {
        switch (line)
        {
            case string _ when UserMovementRegex.Match(line) is { Success: true } match:
                Console.WriteLine($"UserName: {match.Groups["UserName"]}");
                Console.WriteLine($"Position: {match.Groups["Position"]}");
                break;
            default:
                Console.WriteLine("No match");
                break;
        }
    }
}

{ Success: true } match 部分有两个目的:

  • 检查匹配是否成功
  • 它将结果捕获到一个新的 match 变量中,您可以在 case 标签的正文中使用该变量