2017-05-01 58 views
1

晚上好!C#检测用户输入文本框中的单词

我试图实现某种原始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; 
     } 

我希望它可以理解我的问题是什么,因为我可能无法找到合适的语言来获得谷歌,堆栈溢出和公司有用的结果

谢谢

+0

您如何计划只抓取输入的名称部分?有一百万种方法可以让人们自我介绍...... –

+0

我不打算依赖这个特殊的switch语句。就像一个自编的图书馆,其中包含了上百万种介绍方式。但现在它已经足够了。 – Callipo

回答

0

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变量。

+0

嗨。我意识到这是一项艰巨的任务。看起来像正则表达式真的是我想要的。我现在不在我的桌子上,所以我稍后会玩。非常感谢你。 – Callipo

0

这里有一种方法可以做到这一点,但我认为正则表达式会使它简单得多。我只是不太了解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不为空,那么我们找到了前缀。接下来,我们必须抓住名称部分,这将是字符串的其余部分(或直到我们达到我们charactersAfterName角色之一:

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(); 
} 

和输出的样子:

enter image description here

+0

那就是我一开始就在寻找的东西。我究竟如何思考。但似乎正则表达式会是一个更简单的东西,具有相同的输出。当我在我的桌面上时,我会尝试两种解决方案,看看最适合我的是什么。非常感谢你 ! – Callipo

相关问题