如何在 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。 \(?<key>[^:]*)(?::(?<value>[^]*))?
匹配
\
- 一个
字符
(?<key>[^:]*)
- 组“key”:除:
和
之外的零个或多个字符
(?::(?<value>[^]*))?
- 一个可选的非捕获组匹配:
,然后组“值”匹配除
之外的零个或多个字符
-
字符。
【讨论】:
以上是关于如何在 C# 中使用正则表达式解析重复的名称-值对的主要内容,如果未能解决你的问题,请参考以下文章