将字符串与简单的模式进行匹配

本文关键字:模式 字符串 简单 | 更新日期: 2023-09-27 18:10:56

我正在努力证明我正在创建的程序,以便我需要让用户输入的模式不是硬编码。字母或数字的模式总是有可能发生变化,但当它发生时,我需要每个人保持一致。另外,我希望经理们能够在不依赖我的情况下控制一切。是否可以使用正则表达式或其他字符串工具将输入与存储在数据库中的列表进行比较。我希望它很容易,所以存储在数据库中的模式看起来像X######或X######-X#######等等。

将字符串与简单的模式进行匹配

当然,只需将正则表达式规则存储在表中的字符串列中,然后将它们加载到应用程序中的IEnumerable<Regex>中。然后,如果这些规则中的任何一个匹配,那么匹配就是简单的。注意,冲突的规则可能会导致贪婪的竞争(第一个被检查的人获胜),所以你必须小心。还要注意,除了我的示例之外,还有许多优化可以执行,因为我的示例被设计得很简单。

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));

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

我不知道你的格式中具体需要什么字符,但让我们假设你只是想把一个数字替换为#,其余的保持原样,这里有一些代码:

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()
{
    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;
}

它正在做我现在需要它做的一切。谢谢你的建议。我将不得不研究更多的正则表达式在未来。

使用MaskedTextProvider,您可以这样做:

using System.Globalization;
using System.ComponentModel;
string pattern = "X&&&&&&-X&&&&&&&";
string text = "Xabcdef-Xasdfghi";
var culture = CultureInfo.GetCultureInfo("sv-SE");
var matcher = new MaskedTextProvider(pattern, culture);
int position;
MaskedTextResultHint hint;
if (!matcher.Set(text, out position, out hint))
{
    Console.WriteLine("Error at {0}: {1}", position, hint);
}
else if (!matcher.MaskCompleted)
{
    Console.WriteLine("Not enough characters");
}
else if (matcher.ToString() != text)
{
    Console.WriteLine("Missing literals");
}
else
{
    Console.WriteLine("OK");
}

有关格式的说明,请参见:http://msdn.microsoft.com/en-us/library/system.windows.forms.maskedtextbox.mask