如何在 C# 中使用正则表达式解析重复的名称-值对

Posted

技术标签:

【中文标题】如何在 C# 中使用正则表达式解析重复的名称-值对【英文标题】:How to Parse Repeated Name-Value Pairs using Regex in C# 【发布时间】:2021-09-09 04:07:21 【问题描述】:

我正在尝试使用 C# 中的正则表达式从文本中解析键/值标记字符串。例如,给定字符串:

stufftoken1:param1stufftoken2stufftoken3:param3stuff

我会以三个捕获组结束:

(key=token1,value=param1)
(key=token2,value=(null))
(key=token3,value=param3)

我的问题不是编写正则表达式来进行解析,而是将键和值组合在一起。

这是我到目前为止的代码。 (“tokenPattern”被拆分只是为了让正则表达式不那么不堪重负。)

var text = "token1:param1stufftoken2more stufftoken3:param3";
var tokenPattern = @"(?<token>[](?<key>[^:]*)([:](?<value>[^]*))?[])";
var pattern = @"([^]*" + tokenPattern + ")*.*?";
var match = Regex.Match(text, pattern);

匹配成功,“匹配”变量中生成的感兴趣组为:

? match.Groups["token"].Captures
Count = 3
    [0]: token1:param1
    [1]: token2
    [2]: token3:param3
? match.Groups["key"].Captures
Count = 3
    [0]: token1
    [1]: token2
    [2]: token3
? match.Groups["value"].Captures
Count = 2
    [0]: param1
    [1]: param3

因为我的标记的“值”部分是可选的,所以我找不到将“键”与“值”匹配的方法。我想,我可以重新解析每个捕获的“令牌”,但这似乎有点痛苦。

有没有办法深入“令牌”捕获以找到该特定捕获的关联“键”和“值”(如果有)?

【问题讨论】:

为什么在正则表达式中使用包含单个字符的字符类 ([])?那和角色一样吗? @NetMage。主要是因为我很懒惰;我知道 、 和 : 在 RegEx 的某些上下文中具有特殊含义,我想排除意外。 Wiktor 在下面为我清理了这个。, 【参考方案1】:

您可以使用更简单的模式来匹配字符串中出现的所有模式,使用 Regex.Matches - 所有必要的字符串都已被分组:

var text = "token1:param1stufftoken2more stufftoken3:param3";
var pattern = @"\(?<key>[^:]*)(?::(?<value>[^]*))?";
var matches = Regex.Matches(text, pattern);
foreach (Match m in matches)

    Console.WriteLine(m.Value);
    Console.WriteLine(m.Groups["key"].Value);
    Console.WriteLine(m.Groups["value"].Value);

请参阅 C# demo 和 regex demo。 \(?&lt;key&gt;[^:]*)(?::(?&lt;value&gt;[^]*))? 匹配

\ - 一个 字符 (?&lt;key&gt;[^:]*) - 组“key”:除: 之外的零个或多个字符 (?::(?&lt;value&gt;[^]*))? - 一个可选的非捕获组匹配:,然后组“值”匹配除 之外的零个或多个字符 - 字符。

【讨论】:

以上是关于如何在 C# 中使用正则表达式解析重复的名称-值对的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中使用正则表达式从完整路径解析文件名

用于查找 C# 类和方法名称的正则表达式

使用正则表达式从 C# 中的 SQL 语句中查找 SQL 函数

c#正则表达式捕获两个字符串之间的字符串[重复]

在 C# 中使用正则表达式解析电子邮件

需要 C# 正则表达式帮助 [重复]