c# – 如何查找缺少片段的字符串?

我正在使用AIML文件在C#中构建一个聊天机器人,目前我正在使用此代码进行处理:

<aiml>
    <category>
        <pattern>a * is a *</pattern>
        <template>when a <star index="1"/> is not a <star index="2"/>?</template>
    </category>
</aiml>

我想做的事情如下:

if (user_string == pattern_string) return template_string;

但是我不知道怎么告诉电脑这个明星角色可以是什么东西,尤其是那个可以不止一个字!
我正在考虑使用正则表达式,但我没有足够的经验.有人能帮助我吗? 🙂

最佳答案 使用正则表达式

static bool TryParse(string pattern, string text, out string[] wildcardValues)
{
    // ^ and $means that whole string must be matched
    // Regex.Escape (http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.escape(v=vs.110).aspx)
    // (.+) means capture at least one character and place it in match.Groups
    var regexPattern = string.Format("^{0}$", Regex.Escape(pattern).Replace(@"\*", "(.+)"));

    var match = Regex.Match(text, regexPattern, RegexOptions.Singleline);
    if (!match.Success)
    {
        wildcardValues = null;
        return false;
    }

    //skip the first one since it is the whole text
    wildcardValues = match.Groups.Cast<Group>().Skip(1).Select(i => i.Value).ToArray();
    return true;
}

样品用法

string[] wildcardValues;
if(TryParse("Hello *. * * to *", "Hello World. Happy holidays to all", out wildcardValues))
{
    //it's a match
    //wildcardValues contains the values of the wildcard which is
    //['World','Happy','holidays','all'] in this sample
}

顺便说一下,你真的不需要正则表达式,这太过分了.只需使用string.Split将模式拆分为标记,然后使用string.IndexOf查找每个标记,即可实现自己的算法.虽然使用Regex会导致代码更短

点赞