1

我正在使用 C#。我需要正则表达式来检查这样的文本:

abc {val2:123} lorem ipsum {val1:234}

我需要匹配所有的{x:y}。我试过正则表达式{.*}但它匹配整个值 - “ {val2:123} lorem ipsum {val1:234} ”。当然不好玩。

如何适当地更改我的正则表达式?

4

4 回答 4

4
string input = "abc {val2:123} lorem ipsum {val1:234}";
var dict = Regex.Matches(input, @"\{(.+?):(.+?)\}").Cast<Match>()
            .ToDictionary(m => m.Groups[1].Value, m => m.Groups[2].Value);
于 2013-09-10T07:57:51.563 回答
2
\{([^}]*)\}

这匹配 a{后跟零个或多个不是 a 的字符,}然后匹配文字},它将匹配的任何内容放入组 1。

然后,您可以在冒号符号上拆分捕获的组:以获取键和值对。

正则表达式 101 演示

于 2013-09-10T07:58:23.317 回答
2
{(?<param>\w+):(?<value>\w+)}

以上应该可以工作......我已经包含了命名组以使选择值更容易。

于 2013-09-10T07:59:02.933 回答
2

发生这种情况是因为 c sharp regex 默认情况下是贪婪的。只需使用{.*?}

以下代码将完全符合您的要求。这就是使正则表达式变得不受欢迎的那个问号的全部内容。

string s = "abc {val2:123} lorem ipsum {val1:234};";
MatchCollection nonGreedyMatches = Regex.Matches(s, @"{.*?}");
于 2013-09-10T08:01:43.180 回答