【问题标题】:Foreach string occurrenceForeach 字符串出现
【发布时间】:2020-06-26 17:15:12
【问题描述】:

所以我想在一个字符串中读出 C# 中的所有匹配项并使用它。意味着我需要部分字符串的位置,但我不知道如何。示例:

主字符串可以如下所示:

目前在线有 %count{"only_groups":"1, 2, 3","ignore_channels":"1, 2, 3"}% 支持者,%count{"ignore_channels":"1, 2, 3 ","querys":"false"}% 其中是 afk。这些是积极的支持者:%list{"querys":"false","only_groups":"1, 2, 3"}%

从内容上看,这个字符串没有意义,但我想你可以理解我所说的这些字符串的意思。除了 %count% 和 %list% 之外,还有更多可能的变量

现在我想保留所有这些变量并替换一些东西。

我已经有以下代码,但它只会替换一个变量,并且如果它是完全小写的,它只会识别 %count% 变量:

int pFrom = channel_name.IndexOf("%count{") + "%count{".Length;
int pTo = channel_name.LastIndexOf("}%");
字符串结果 = channel_name.Substring(pFrom, pTo - pFrom);
记录器.信息(结果);

字符串 json2 = @"{" + 结果 + "}";

JObject o2 = JObject.Parse(json2);

foreach(o2.Properties() 中的 JProperty 属性)
{
    var pname = property.Name;
    if (pname == "only_groups")
    {
        only_groups = property.Value.ToString();
    }
    否则 if (pname == "ignore_groups")
    {
        ignore_groups = property.Value.ToString();
    }
    else if (pname == "only_channels")
    {
        only_channels = property.Value.ToString();
    }
    否则 if (pname == "ignore_channels")
    {
        ignore_channels = property.Value.ToString();
    }
    else if (pname == "away")
    {
        away = property.Value.ToString();
    }
    else if (pname == "querys")
    {
        查询 = property.Value.ToString();
    }
}
var serverVar = (await fullClient.GetServerVariables()).Value;
if (query.Equals("only"))
{
    channel_name = "用户在线:" + serverVar.QueriesOnline;
}
else if (query.Equals("ignore"))
{
    channel_name = "用户在线:" + (serverVar.ClientsOnline - serverVar.QueriesOnline);
}
别的
{
    channel_name = "用户在线:" + serverVar.ClientsOnline;
}

我希望人们理解我将要做什么。我的英语不是最好的

【问题讨论】:

  • 你如何表示百分比符号,就像我想说“购买时节省 50%!”在你的字符串中?

标签: c# json string


【解决方案1】:

使用 Regex.Matches() 获取所有出现的列表。

此模式将查找所有变量,包括配置 json:

(?s)%.*?%

那么你只需要从匹配值中提取2部分。

这将只找到匹配值中的变量名:

(?s)(?<=%).+?(?=({|%))

如果有的话,这将在匹配的值中找到 JSON 配置:

(?s){.*}

唯一需要注意的是,您不能在变量之外的文本中的任何地方使用 % 字符。

【讨论】:

  • 谢谢,这很好用,但是我如何得到变量在字符串中的位置,以便我可以替换它
  • Regex.Replace()。就像您用鼠标选择匹配项并将替换项写在其上一样。只需将第一个正则表达式模式替换为任何内容即可。
  • 如果你不想做RegexReplace,你也可以从每个匹配中获取索引和出现的长度,并使用正常的字符串操作,只要记住从最后一个到第一个向后处理出现一,这样索引就不会在你替换东西时发生变化。
  • 我刚刚在他们的解决方案中发现了一个错误。如果我有以下内容,则 %client% 的值会占用最后一个 % 字符之前的所有内容:%client{"uid":"Cx6Vh0w8LTe1mvxQxueLnU6vw34=","afk_away":"true"}% | %count{"querys":"ignore"}%
  • 你是对的,但错误在第一个模式中,当它实际上是 2 时,将你的示例检测为单个变量。错过了延迟扩展的问号,所以它花了太多时间。在上面修复它现在将您的示例检测为 2 个单独的变量。如果有效,请将答案标记为已接受。
猜你喜欢
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 2017-03-20
  • 2010-10-20
相关资源
最近更新 更多