C# 将字符串与简单模式匹配

C# 将字符串与简单模式匹配,c#,regex,string,pattern-matching,C#,Regex,String,Pattern Matching,我正试图证明我正在创建的一个程序的未来性,这样我需要让用户加入的模式就不会是硬编码的。字母或数字模式总是有可能改变,但当它改变时,我需要每个人保持一致。另外,我希望经理们能够在不依赖我的情况下控制一切。是否可以使用正则表达式或其他字符串工具将输入与存储在数据库中的列表进行比较。我希望它很简单,这样存储在数据库中的模式看起来像X或X。当然,只需将正则表达式规则存储在表中的字符串列中,然后将它们加载到应用程序中的代码中即可。然后,只要这些规则中的任何一条匹配,就可以进行匹配。请注意,相互冲突的规则可

我正试图证明我正在创建的一个程序的未来性,这样我需要让用户加入的模式就不会是硬编码的。字母或数字模式总是有可能改变,但当它改变时,我需要每个人保持一致。另外,我希望经理们能够在不依赖我的情况下控制一切。是否可以使用正则表达式或其他字符串工具将输入与存储在数据库中的列表进行比较。我希望它很简单,这样存储在数据库中的模式看起来像X或X。当然,只需将正则表达式规则存储在表中的字符串列中,然后将它们加载到应用程序中的代码中即可。然后,只要这些规则中的任何一条匹配,就可以进行匹配。请注意,相互冲突的规则可能会导致贪婪的竞争(第一个被检查的人获胜),所以在这方面你必须小心。还要注意的是,除了我的示例之外,还有许多优化可以执行,我的示例设计得非常简单

List<string> regexStrings = db.GetRegexStrings();
var result = new List<Regex>(regexStrings.Count);
foreach (var regexString in regexStrings)
{
    result.Add(new Regex(regexString);
}

...

// The check
bool matched = result.Any(i => i.IsMatch(testInput));
List regexStrings=db.GetRegexStrings();
var result=新列表(regexStrings.Count);
foreach(regexStrings中的var regexString)
{
结果.添加(新正则表达式(正则表达式字符串);
}
...
//支票
bool matched=result.Any(i=>i.IsMatch(testInput));
使用,您可以执行以下操作:

using System.Globalization;
using System.ComponentModel;

有关格式的说明,请参见:

您可以将模式按原样存储在数据库中,然后将其转换为正则表达式

我不知道您的格式需要哪些字符,但假设您只想将一个数字替换为
#
,其余部分保持不变,下面是一些代码:

public static Regex ConvertToRegex(string pattern)
{
    var sb = new StringBuilder();

    sb.Append("^");

    foreach (var c in pattern)
    {
        switch (c)
        {
            case '#':
                sb.Append(@"\d");
                break;

            default:
                sb.Append(Regex.Escape(c.ToString()));
                break;
        }
    }

    sb.Append("$");

    return new Regex(sb.ToString());
}
如果需要的话,还可以使用诸如
RegexOptions.IgnoreCase
之类的选项

注意:由于某种原因,
Regex.Escape
会对
#
字符进行转义,尽管它并不特别……所以我选择了逐字符的方法。

private bool TestMethod()
        private bool TestMethod()
{
    const string textPattern = "X###";
    string text = textBox1.Text;
    bool match = true;

    if (text.Length == textPattern.Length)
    {
        char[] chrStr = text.ToCharArray();
        char[] chrPattern = textPattern.ToCharArray();
        int length = text.Length;

        for (int i = 0; i < length; i++)
        {
            if (chrPattern[i] != '#')
            {
                if (chrPattern[i] != chrStr[i])
                {
                    return false;
                }
            }
        }
    }
    else
    {
        return false;
    }
    return match;
}
{ 常量字符串textPattern=“X####”; string text=textBox1.text; 布尔匹配=真; if(text.Length==textPattern.Length) { char[]chrStr=text.ToCharArray(); char[]chrPattern=textPattern.ToCharArray(); int length=text.length; for(int i=0;i

这正是我现在需要它做的一切。不过感谢所有的提示。我以后将不得不更多地研究正则表达式。

您可能可以使用掩码(某种正则表达式)代替真正的正则表达式:请看,这些可以在文本框中使用,以允许用户只输入有效文本。是WPF还是Win表单?请为您的要求添加更多细节。Rgds,这个示例确实有效,但如何使其更动态地工作。如果输入为X,并且数据库具有X,则返回为真。不过,我想要的是X对X123为true,对X1234为false。这种类型的比较。另外,我希望数据库能够实际保存“X”###。我知道在excel中,您可以创建这样的自定义字段。您可以使用正则表达式约束…有一些方法可以限制匹配输入。您需要通过谷歌搜索了解限制正则表达式输入的方法。
        private bool TestMethod()
{
    const string textPattern = "X###";
    string text = textBox1.Text;
    bool match = true;

    if (text.Length == textPattern.Length)
    {
        char[] chrStr = text.ToCharArray();
        char[] chrPattern = textPattern.ToCharArray();
        int length = text.Length;

        for (int i = 0; i < length; i++)
        {
            if (chrPattern[i] != '#')
            {
                if (chrPattern[i] != chrStr[i])
                {
                    return false;
                }
            }
        }
    }
    else
    {
        return false;
    }
    return match;
}