You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# .NET5中如何用正则仅匹配(* *)括号内的键值对

解决C# .NET5中仅捕获(* *)括号内键值对的正则问题

核心思路

要仅捕获(* *)括号内的键值对,必须先限定匹配范围,避免捕获括号外的内容。可通过两种方式实现:分步提取括号内内容再匹配键值对,或使用正则断言直接锁定捕获范围。

方案一:分步处理

先提取(* *)内的文本,再在该范围内匹配键值对,逻辑清晰且易调试:

string input = "Parameter=\"None\" (* Category=\"/Production/Station2/Commands\" Type=\"Execute\" *)";

// 第一步:捕获(* 和 *)之间的内容
Match bracketMatch = Regex.Match(input, @"\(\*([\s\S]*?)\*\)");
if (bracketMatch.Success)
{
    string innerContent = bracketMatch.Groups[1].Value;
    // 第二步:提取键值对,修正原正则的贪婪匹配问题
    MatchCollection kvMatches = Regex.Matches(innerContent, @"(\w+)\s*=\s*""?([^""\s]+)""?");
    
    foreach (Match kvMatch in kvMatches)
    {
        string key = kvMatch.Groups[1].Value;
        string value = kvMatch.Groups[2].Value;
        // 输出或处理键值对
        Console.WriteLine($"键:{key},值:{value}");
    }
}

方案二:单个正则直接捕获

利用正则的正向预查和反向预查,直接限定键值对必须位于(* *)范围内:

string input = "Parameter=\"None\" (* Category=\"/Production/Station2/Commands\" Type=\"Execute\" *)";

// 正则断言限定捕获范围,同时修正贪婪匹配
MatchCollection matches = Regex.Matches(
    input, 
    @"(?<=\(\*[\s\S]*?)(\w+)\s*=\s*""?([^""\s]+)""?(?=[\s\S]*?\*\))", 
    RegexOptions.Singleline
);

foreach (Match match in matches)
{
    string key = match.Groups[1].Value;
    string value = match.Groups[2].Value;
    Console.WriteLine($"键:{key},值:{value}");
}

原正则问题说明

原正则@"(\w+)\s*=\s*""?(.+)\b""?"存在两个问题:

  1. 未限定匹配范围,会捕获整个字符串中所有符合格式的键值对,包括括号外的内容;
  2. .+是贪婪匹配,可能会将多个键值对的内容合并捕获,改为[^""\s]+可精准匹配引号或空格分隔的取值内容。

内容的提问来源于stack exchange,提问作者Elia Nese

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 22:23:13