搜索给定字符串中的单词

时间:2014-04-29 20:53:11

标签: c# asp.net regex

我有一串用户可以输入的单词,我需要按照下面给出的顺序搜索特定单词,并根据所选单词采取行动。

  • 加入,是
  • 停止,
  • 取消
  • 帮助
  • 帐户

例如,如果用户输入命令Card Stop作为输入,那么我应首先处理单词Stop而不是Card。同样,如果用户输入Join Frank,那么我应该处理单词Join。同样,如果用户输入Stop Help,那么我应该处理Stop

我该怎么做?

编辑

我尝试了以下操作,但在这种情况下,需要搜索的有效单词集放在Enum中,然后循环遍历拆分文本。但在这种情况下,如果用户输入单词为"卡片停止"然后因为它是Enum中的正确命令之一,它只是发送卡的响应并跳过其余的。我理想的是它应该处理Stop而不是Card。基本上遵循上述优先顺序。 那可能吗?

var Tokens = Regex.Split(userText, @"\s+"); 

            foreach (string stringText in Tokens)
            {
                if (Enum.IsDefined(typeof(TextType), stringText))
                {
                    textType = (TextType)Enum.Parse(typeof(TextType), stringText, true);
                    if ((isTextTypeJoin(textType)))
                    {
                        return textType;
                    }
                }
            }

3 个答案:

答案 0 :(得分:1)

这里的诱惑是首先通过用户输入循环,检查您的优先级'在循环中寻找的选项。唐'吨。遍历您所寻找的选项,为其中一个选项提供用户输入。

  • 将搜索到的字词拆分为list <string> sought
  • 将输入字词拆分为list <string> inputs
  • foreach string seek for seek
    • if inputs.contains(seek)
      • 采取行动寻求
      • (听起来你想要打破循环并根据你的例子停止处理,但你的开头句意味着你应该继续循环。)

答案 1 :(得分:1)

为了响应您的编辑,您需要将其翻转,以便循环浏览enum,而不是通过输入:

foreach(var entry in Enum.GetNames(typeof(TextType)))
{
    if (Regex.IsMatch(input, string.Format(@"\b{0}\b", Regex.Escape(entry))))
    {
        return entry;
    }
}

return TextType.SomeDefaultValue;

input是您的用户输入字符串。这将遍历枚举值并返回在字符串中找到的第一个值。

答案 2 :(得分:0)

编辑 - 我拿出了无关的答案 嘿,对不起这个愚蠢的回答,我开始在你的编辑之前打字。无论如何,我只是想到了一个非常优雅的解决方案,但它确实有效。

List<string> input = Console.ReadLine().Split(' ').ToList();

if(input.Any(x => x == "join")) Console.Write("JOIN");
if(input.Any(x => x == "stop")) Console.Write("STOP");

您的if语句将按优先顺序排列。如果您输入stop join,则输出为JOIN STOP。希望这是你正在寻找的。

编辑2:

你说你的输入不是来自控制台,所以我认为你可以做类似的事情 List<string> input = Regex.Split(userText, @"\s+").ToList();然后使用上面的答案。