C# 检测用户输入文本框中的单词
C# Detecting a word in user input textbox
晚上好!
我正在尝试实现某种原始 AI。我的爱好项目基本上包含两个文本框。一个用于输入,一个用于输出。
所以假设用户在调情几个小时后有冲动告诉我的 AI 他的名字。他会输入 "I am called 'Jack Black'"
我如何将他的名字存储在变量中? (或将名字和姓氏分别存储在一个变量中)
是否有某种占位符机制可以让我在一组预测词之后存储名称字符串? (喜欢"I am called")
我的猜测:
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.
上找到合适的词来获得有用的结果
谢谢
流氓。我不确定您是否意识到您所承担的任务是多么艰巨。我的更高级别的建议是:查找 'Eliza' 并尝试用 C# 编写它的端口。这是一个简单的聊天机器人,如果您有兴趣,可以从那里进行调整。
至于你的具体问题?我认为您正在寻找的是 Regex's。像这样:
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。
首先,您可以创建一个 "well known prefixes" 自我介绍人列表:
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', ';', ':'
};
然后,您可以搜索您找到的第一个 "introduction prefix" 的索引:
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
。如果它找到一个名称,它 returns true
并将 name
参数设置为找到的名称,否则它 returns 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();
}
输出如下:
晚上好!
我正在尝试实现某种原始 AI。我的爱好项目基本上包含两个文本框。一个用于输入,一个用于输出。
所以假设用户在调情几个小时后有冲动告诉我的 AI 他的名字。他会输入 "I am called 'Jack Black'"
我如何将他的名字存储在变量中? (或将名字和姓氏分别存储在一个变量中)
是否有某种占位符机制可以让我在一组预测词之后存储名称字符串? (喜欢"I am called")
我的猜测:
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.
上找到合适的词来获得有用的结果谢谢
流氓。我不确定您是否意识到您所承担的任务是多么艰巨。我的更高级别的建议是:查找 'Eliza' 并尝试用 C# 编写它的端口。这是一个简单的聊天机器人,如果您有兴趣,可以从那里进行调整。
至于你的具体问题?我认为您正在寻找的是 Regex's。像这样:
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。
首先,您可以创建一个 "well known prefixes" 自我介绍人列表:
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', ';', ':'
};
然后,您可以搜索您找到的第一个 "introduction prefix" 的索引:
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
。如果它找到一个名称,它 returns true
并将 name
参数设置为找到的名称,否则它 returns 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();
}
输出如下: