首页 > 解决方案 > 如何在 C# 中使用正则表达式构造一个简单的程序来检查部分匹配的输入

问题描述

我正在尝试创建一个类来使用正则表达式进行部分匹配。我基本上已经迷失了如何执行搜索。

输入将像“flour#yeast#banana”一样出现,其中 # 代表未知长度、未知的字母集合。搜索必须保持面粉_ _ _酵母_ _ _香蕉的顺序。所以比赛将包括

“面粉香蕉”

“flouraddyeastmashbanana”

“flouraddyeast香蕉”

但不是

“酵母花”

我想的正则表达式代码是@" ^[a - zA - Z] + $"

到目前为止我得到的是

static void Main(string[] args)
    {
        string[] input = "flour#yeast#banana".Split('*');
        string[] searchblock = new string[4] { "flouryeastbanana", "flouraddyeastmashbanana", "flouraddyeastbanana", "yeastflourbanana" };
        string pattern = @" ^[a - zA - Z] + $";


        foreach (string s in searchblock)
        {
            if (System.Text.RegularExpressions.Regex.IsMatch(s, pattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase))
            {
                Console.WriteLine($"  (match for '{pattern}' found)");
            }
        }
        Console.ReadLine();
    }

但我无法理解如何继续前进,也不知道如何让它搜索超过 1/0 的随机字母......所以我很确定我错了

标签: c#regex

解决方案


我只是用'*'你的输入字符串替换(或者是'#'吗?你的问题不清楚......叙述说的是一件事,代码暗示了另一件事),".*?"然后使用整个字符串作为你的模式。例如:

static void Main(string[] args)
{
    string input = "flour*yeast*banana";
    string[] searchblock = new string[4] { "flouryeastbanana", "flouraddyeastmashbanana", "flouraddyeastbanana", "yeastflourbanana" };
    string pattern = input.Replace("*", ".*?");

    foreach (string s in searchblock)
    {
        if (System.Text.RegularExpressions.Regex.IsMatch(s, pattern, System.Text.RegularExpressions.RegexOptions.IgnoreCase))
        {
            Console.WriteLine($"input \"{s}\":  (match for '{pattern}' found)");
        }
    }
}

正则表达式中的序列".*?"表示匹配任意数量的任意字符,尽可能少的字符仍然允许匹配成功。通过在输入字符串中使用它代替您的标记,这允许与您的非标记字符串由任何其他字符分隔的任何字符串匹配。

请注意,?在您的情况下,字符串中的 可能是可选的。如果您多次使用包含非标记字符串的字符串呈现模式,则匹配发生的位置会产生细微的差别,但不应影响字符串是否实际匹配。因此,如果您愿意,您可能只使用".*"作为替换文本而不是".*?".


推荐阅读