如何在文本中找到像“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<string, SpellVarsDto>
(如 a2
a5` 等)来显着加快速度。您可以使用 linq 轻松构建字典:var myDictionary = vars.ToDictionary(item => item.key);
。此外,如果 list
或 s
很长,使用 Regex 查找 [ae]\d+
模式会更快,而不是构建字符串并通过 Contains 进行搜索。
@quetzalcoatl 感谢您的提示!但我从 Json 得到这些列表,类型应该是列表,有没有办法将列表转换为字典?
是的,我刚刚在评论中写了。如果你有一个名为vars
的列表,就像你粘贴为答案的函数List<Models.SpellVarsDto> vars
一样,你可以把它变成这样的字典:var myDictionary = vars.ToDictionary(item => 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”这样的特殊标记并将它们替换为列表中的匹配数据?的主要内容,如果未能解决你的问题,请参考以下文章