正则表达式:匹配项在每个匹配项中查找最少的字符

时间:2019-06-20 11:06:00

标签: c# regex pattern-matching

我想遍历每个匹配项,但是我的代码只能通过在模式中找到第一个和最后一个字符之间的所有内容来找到1个匹配项。

基本上,我想遍历以下字符串中找到的3个匹配项:

value = "{account_id}{user_id}{someValue}";

值可以包含任意数量的“ {str}”子字符串,其中str是大写或小写字符,并且可以包含_

但是它只能使用以下模式找到1个匹配项(整个内容):"{\\S+}"

foreach (Match match in Regex.Matches(value, "{\\S+}"))
{
    var key = match.Value.Replace("{", "").Replace("}", "").Trim();
    // do stuff with key...
}

这是有道理的,因为“ {”和“}”都是非空格字符,因此我尝试使用"{[a-zA-Z_]}",但这也失败了。

foreach (Match match in Regex.Matches(value, "{[a-zA-Z_]}"))
{
    var key = match.Value.Replace("{", "").Replace("}", "").Trim();
    // do stuff with key...
}

循环中的变量键应该是“ account_id”,然后是“ user_id”,然后是“ someValue”,但是始终是“ account_iduser_idsomeValue(整个内容)”。

我该如何解决?

编辑:我只是尝试将*添加到模式的末尾,但是它仅返回2个匹配项(一个空集,然后又返回整个内容)。相反,使用+将只返回1个结果(整个结果而不是空集),这没有什么不同。 enter image description here

2 个答案:

答案 0 :(得分:0)

这是因为您没有考虑要搜索的文本中{}的多次出现。向您的正则表达式中添加量词,例如"({\\w})*",那么进行多次捕获应该很好。

如果始终至少有1个匹配项,请将*换为+。

答案 1 :(得分:0)

我使用({[a-zA-Z_]+})作为我的模式对其进行了修复。经过很多猜测和调整才能弄清楚这一点。