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""?"存在两个问题:
- 未限定匹配范围,会捕获整个字符串中所有符合格式的键值对,包括括号外的内容;
.+是贪婪匹配,可能会将多个键值对的内容合并捕获,改为[^""\s]+可精准匹配引号或空格分隔的取值内容。
内容的提问来源于stack exchange,提问作者Elia Nese
相关产品推荐
相关产品推荐

