从文本中替换特定文本
本文关键字:文本 替换 | 更新日期: 2023-09-27 18:13:53
我正在为一个带有自定义库的游戏编写聊天辅助工具。
我想在玩家发送消息时改变特定的变量。
这是我的代码
static List<string> asciis = new List<string> { "shrug", "omg" };
static List<string> converteds = new List<string> { @"¯'_(ツ)_/¯", @"◕_◕"};
private static void Game_OnInput(GameInputEventArgs args)
{
newtext = args.Input;
foreach (var ascii in asciis)
{
foreach (var converted in converteds)
{
if (args.Input.Contains(ascii))
{
newtext = args.Input.Replace(ascii, converted);
Game.Say(newtext);
}
}
}
}
正如你所看到的,我正试图从"asciis"中获取文本,并将它们转换为"converteds"(按顺序)。
每当我输入一些不在"asciis"列表中的东西时,它就会完美地工作。但是每当我输入耸耸肩膀时,它打印¯'_(ツ)_/¯
+ ◕_◕
+ ◕_◕
(它打印omg 2次)。omg也是一样。
你可能明白我真的是初学者。我真的不明白这段代码有什么问题…
似乎你的两个列表具有相同的长度(就包含的元素而言),并且一个列表中的每个元素在另一个列表中的相同位置都有其替换。
那么您可以将两个列表视为两个数组,并使用不同的方式搜索输入项并用替换文本
替换它private static void Game_OnInput(GameInputEventArgs args)
{
newtext = args.Input;
for(int x = 0; x < ascii.Count; x++)
if (args.Input.Contains(ascii[x]))
{
newtext = args.Input.Replace(ascii[x], converted[x]);
Game.Say(newtext);
}
}
虽然我不认为有很大的改进,你也可以实现相同的字典
static Dictionary<string, string> converter = new Dictionary<string, string>()
{
{"shrug", @"¯'_(ツ)_/¯"},
{"omg", @"◕_◕"}
};
private static void Game_OnInput(GameInputEventArgs args)
{
newtext = args.Input;
foreach(KeyValuePair<string, string> kvp in converter)
if (args.Input.Contains(kvp.Key))
{
newtext = args.Input.Replace(kvp.Key, kvp.Value);
Game.Say(newtext);
}
}
好吧,这可能更容易读,但我们仍然需要逐个遍历字典中的键
正如Daniel在他的评论中指出的,这是字典的一个很好的用例。
有一个字典,将你想要替换的文本映射到你想要替换的内容:
Dictionary<string, string> dict = new Dictionary<string, string>
{
{"shrug", @"¯'_(ツ)_/¯" },
{"omg", "◕_◕" }
}; // etc
然后从字典中找到所有出现的键,并用相应的值替换它们。
为什么你使用static
方法和字段?我可能是错的,但我希望大多数,如果不是所有的其他方法和字段都是static
。我强烈建议不要习惯它们。
你的主要问题是你总是替换args。输入,但每次都将结果存储在newtext中,覆盖之前的替换。你的下一个问题是,你在每次替换尝试后输出结果,所以这就是为什么你会得到多个奇怪的输出结果。
我还建议使用字典,因为根据定义,它是一个事物到另一个事物的映射。另外,请注意下面的更改,我已经移动了游戏。在循环之外调用并更改为"args.Input"。替换" to "newtext。替换"
Dictionary<string, string> dictionary = new Dictionary<string, string>
{
{"shrug", @"¯'_(ツ)_/¯" },
{"omg", "◕_◕" }
};
private static void Game_OnInput(GameInputEventArgs args)
{
string newtext = args.Input;
foreach(string key in dictionary.Keys){
newtext = newtext.Replace(key,dictionary[key]);
}
Game.Say(newtext);
}