如何在文本中找到像“e3”这样的特殊标记并将它们替换为列表中的匹配数据?

Posted

技术标签:

【中文标题】如何在文本中找到像“e3”这样的特殊标记并将它们替换为列表中的匹配数据?【英文标题】:How can I find special markers like "e3" in text and replace them with matching data from a list?如何在文本中找到像“e3”这样的特殊标记并将它们替换为列表中的匹配数据? 【发布时间】:2016-08-06 07:57:10 【问题描述】:

我有一个名为effectBurn的列表:

[
    "",
    "60/80/100/120/140",
    "2.5",
    "30",
    "",
    "20/40/60/80/100",
    "0.08",
    "0.15"
],

我有一个包含 " e1 " 的字符串。如何将 e1 转换为 effectBurn[1],“ e2 ” 转换为 effectBurn[2],以及 e3、e4、..?

例如:

"Spell effects:  e1 "

进入

"Spell effects: 60/80/100/120/140"

【问题讨论】:

我完全不清楚“并且e1 等于list[1]”是什么意思。基本上,你的问题不清楚。你能提供一个minimal reproducible example吗? (根据您的主题,这与 e3 有什么关系?) 你不能。在 c# 中,所有输入类型都必须是已知的。看起来您的输入如下:空字符串、正斜杠分隔的整数、双精度、整数(或浮点数)。然后模式重复。 我也没听懂你在问什么 我仍然完全不清楚你在问什么。 @AshkanSirous 我想用 effectBurn[1] 替换“ e1 ”,用 effectBurn[2] 替换“ e2 ”(抱歉英语不好) 【参考方案1】:

您可以使用正则表达式。

int index = 0;
string pattern = @"\s*e\d+\s*";
string result = Regex.Replace(text, pattern, m => effectBurn[++index]);

text 是您的源字符串。

【讨论】:

【参考方案2】:

这就是我发现的解决方案:

string Replace(string s,List<string> list,List<Models.SpellVarsDto> vars) 
        for (int i = 0; i < list.Count; i++)
        
            string s1 = " e" + i.ToString() + " ";
            if (s.Contains(s1))
            
                string s2 = s.Substring(s.IndexOf(s1), s1.Length);
                s = s.Replace(s1, list[i]);

                spellDesc.Text = s;
                //MessageBox.Show(s + " " + s1 + " " + list[i]);
            
            string s3 = " a" + i.ToString() + " ";
            if (s.Contains(s3))
            
                foreach (Models.SpellVarsDto item in vars)
                
                    if (item.key == "a" + i.ToString())
                    
                        string s4 = s.Substring(s.IndexOf(s3), s3.Length);
                        s = s.Replace(s3, item.coeff[0].ToString());

                        spellDesc.Text = s;
                    
                

            
        
        return null;
    

【讨论】:

感谢这段代码,我明白了你的意思。很好,你在这里添加了它!它当然工作正常。但是,如果列表 vars 很长,它的运行速度会很慢。您可以通过将 vars 从 List 更改为由 key 索引的 Dictionary&lt;string, SpellVarsDto&gt;(如 a2 a5` 等)来显着加快速度。您可以使用 linq 轻松构建字典:var myDictionary = vars.ToDictionary(item =&gt; item.key);。此外,如果 lists 很长,使用 Regex 查找 [ae]\d+ 模式会更快,而不是构建字符串并通过 Contains 进行搜索。 @quetzalcoatl 感谢您的提示!但我从 Json 得到这些列表,类型应该是列表,有没有办法将列表转换为字典? 是的,我刚刚在评论中写了。如果你有一个名为vars 的列表,就像你粘贴为答案的函数List&lt;Models.SpellVarsDto&gt; vars 一样,你可以把它变成这样的字典:var myDictionary = vars.ToDictionary(item =&gt; item.key);。把它放在函数的开头。请务必添加using System.Linq;。然后你可以通过简单的myDictionary["a3"] 而不是整个 foreach-spellvars 循环来获取值。 哦,如果您尝试获取“a3”并且字典中不包含它,那么字典会抛出异常。您可能需要先与dict.ContainsKey("a3") 联系。当然你可以用变量代替“a3”,我只是用a3作为例子。【参考方案3】:

这个问题模棱两可。我将尝试解释最简单的 C# 代码可能对您有所帮助。但我真的不知道你到底在问什么

如果你有一个变量并且你想把 effectBurn[1]- ("60/80/100/120/140")- 放在里面,这很简单,不需要知道那个变量里面是什么:

string myVariable= " e1 "; 
myVariable = effectBurn[1];

如果你想将 effectBurn[1] 放在 字符中,你可以这样做

myVariable =""+ effectBurn[1]+"";

你的问题根本不清楚

【讨论】:

抱歉英语不好:P 这就是我找到的解决方案:pasted.co/bc0633ae

以上是关于如何在文本中找到像“e3”这样的特殊标记并将它们替换为列表中的匹配数据?的主要内容,如果未能解决你的问题,请参考以下文章

HTMLJSCSS之特殊字符

SQL:有没有办法找到重复项并将它们标记为带有大小写的新列

多个按钮/文本在一个圆圈中颤动

iOS 实时检测来自相机的一些标记

这些文本格式标记是啥,我怎样才能故意将它们插入另一个文件?

如何从文本框中读取文本并将其中的一些链接?