如何在 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
标签的正文中使用该变量
我想编写一个代码来检查它是否与正则表达式匹配,然后打印匹配的字符串。
我发现了其他问题 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
标签的正文中使用该变量