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

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

stuff{token1:param1}stuff{token2}stuff{token3:param3}stuff

我会以三个捕获组结束:

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

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

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

var text = "{token1:param1}stuff{token2}more stuff{token3: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 在下面为我清理了这个。,

标签: c# regex


【解决方案1】:

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

var text = "{token1:param1}stuff{token2}more stuff{token3: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# demoregex demo\{(?&lt;key&gt;[^:}]*)(?::(?&lt;value&gt;[^}]*))?} 匹配

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-19
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多