【发布时间】: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 在下面为我清理了这个。,