从文本中替换特定文本

本文关键字:文本 替换 | 更新日期: 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);
}