繁体   English   中英

C#检测用户输入文本框中的单词

[英]C# Detecting a word in user input textbox

晚上好!

我正在尝试实现某种原始AI。 我的爱好项目基本上包含两个文本框。 一个用于输入,一个用于输出。

因此,让我们说用户在经过几个小时的调情后会感觉到要告诉我的AI他的名字的冲动。 他会输入“我叫'杰克布莱克'”

我如何将他的名字存储在一个变量中呢? (或者在一个变量中存储名字和姓氏)

是否有某种占位符机制,我可以在一组预测的单词后存储名称字符串? (比如“我被称为”)

我猜:

switch (MyMessage)
        {
            case "Hi":
                BotSays("Hello!");
                break;
            case "I am called " + PLACEHOLDER:
                BotSays("Thats a pretty sick name!");
                user_firstName = PLACEHOLDER;
                break;
            default:
                BotSays("Sory me no understand");
                break;
        }  

我希望我的问题是可以理解的,因为我可能无法在Google,Stack Overflow和Co.上找到合适的结果来获得有用的结果。

谢谢

Hooboy。 我不确定你是否意识到你所承担的任务是多么具有纪念意义。 我的更高级别的建议是:查找'Eliza'并尝试在C#中编写它的端口。 这是一个简单的聊天机器人,你可以从那里调整,如果你感兴趣的话。

至于你的具体问题? 我想你正在寻找的是Regex'es。 采取这样的事情:

string sampleText = "Hello, my name is Inigo Montoya";
Regex namePattern = new Regex(@"Hello, my name is (?<FirstName>\w+) (?<LastName>\w+)$");
Match match = namePattern.Match(sampleText);
string firstName = match.Groups["FirstName"].Value;
string lastName = match.Groups["LastName"].Value;

MessageBox.Show("He said his name was " + firstName + " " + lastName);

...正则表达式是一种以动态方式解析字符串的非常简洁的方法。 在这种情况下,它会让你检查名称是否与正则表达式匹配 - 如果是,它将为你填写firstName和lastName变量。

这是一种方法,虽然我认为正则表达式会使它更简单。 我只是不太了解RegEx。

首先,您可以为介绍自己的人创建一个“众所周知的前缀”列表:

var stringsBeforeIntroduction = new List<string>
{
    "I am called ",
    "My name is ",
    "People call me ",
    "You can refer to me as "
};

以及一个名称后面的已知字符列表:

var charactersAfterName = new char[]
{
    ' ', ',', '.', '\n', ';', ':'
};

然后,您可以搜索您找到的第一个“简介前缀”的索引:

var firstPrefixFound =
    stringsBeforeIntroduction.FirstOrDefault(
        prefix => MyMessage.IndexOf(prefix, StringComparison.OrdinalIgnoreCase) > -1);

现在,如果firstPrefixFound不为null,那么我们找到了前缀。 接下来我们必须获取名称部分,它将是字符串的其余部分(或者直到我们点击其中一个charactersAfterName AfterName字符:

if (firstPrefixFound != null)
{
    // Calculate the indexes of the start and end of the name
    int prefixLength = firstPrefixFound.Length;
    int startName = MyMessage.IndexOf(firstPrefixFound, 
        StringComparison.OrdinalIgnoreCase) + prefixLength;
    int endOfName = MyMessage.IndexOfAny(charactersAfterName, startName) - startName;

    if (endOfName < 0) endOfName = MyMessage.Length - startName;

    // Assign the name that we found
    user_firstName = MyMessage.Substring(startName + prefixLength, endOfName);
}

将它们放在一个函数中可能如下所示,它尝试从input字符串中检测name 如果找到名称,则返回true并将name参数设置为找到的名称,否则返回false并将name参数设置为指定的defaultValue字符串:

private static bool TryGetName(string input, string defaultValue, out string name)
{
    var stringsBeforeIntroduction = new List<string>
    {
        "I am called ",
        "My name is ",
        "People call me ",
        "You can call me ",
        "You can refer to me as "
    };

    var charactersAfterName = new char[]
    {
        ' ', ',', '.', '\n', ';', ':'
    };

    var firstPrefixFound = stringsBeforeIntroduction.FirstOrDefault(prefix =>
        input.IndexOf(prefix, StringComparison.OrdinalIgnoreCase) > -1);

    if (firstPrefixFound != null)
    {
        // Calculate the indexes of the start and end of the name
        int prefixLength = firstPrefixFound.Length;
        int startName = input.IndexOf(firstPrefixFound, 
            StringComparison.OrdinalIgnoreCase) + prefixLength;
        int endOfName = input.IndexOfAny(charactersAfterName, startName) - startName;

        if (endOfName < 0) endOfName = input.Length - startName;

        // Assign the name that we found
        name = input.Substring(startName, endOfName);
    }
    else
    {
        name = defaultValue;
        return false;
    }

    return true;
}

然后用法看起来像:

string name = "stranger";

while (true)
{
    Console.Write("Input some text: ");
    Console.WriteLine(TryGetName(Console.ReadLine(), name, out name)
        ? $"I detected your name is: '{name}'"
        : $"I did not detect your name that time, {name}.");
    Console.WriteLine();
}

输出看起来像:

在此输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM