将字符串与简单模式匹配

时间:2014-07-01 17:43:12

标签: c# regex string pattern-matching

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

4 个答案:

答案 0 :(得分:0)

当然,只需将正则表达式规则存储在表格的字符串列中,然后将其加载到应用中的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));

答案 1 :(得分:0)

使用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

答案 2 :(得分:0)

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

我不清楚具体说明您的格式需要哪些字符,但我们假设您只想将一个数字替换为#并将其余部分保留为原样,这里有一些代码:

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转义#字符,即使它并不特别......所以我只是逐个字符的方法。

答案 3 :(得分:0)

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

这就是我现在需要做的一切。谢谢你的所有提示。我将来必须更多地研究正则表达式。