Если вы хотите, чтобы динамически создаваться, тогда я бы просто избегал регулярных выражений. Постройте несколько объектов, чтобы выполнить эту работу за вас.
Первый очень простой класс только для проверки одного символа с произвольной проверки соответствия:
public class Matcher
{
public char Flag { get; private set; }
private readonly Predicate<char> Checker;
public Matcher(char flag, Predicate<char> checker)
{
this.Flag = flag;
this.Checker = checker;
}
public bool DoesMatch(char character)
{
return Checker(character);
}
}
Тогда некоторый класс проверки, который делает тяжелую работу:
public class StringValidator
{
private Dictionary<char, Matcher> Matchers = new Dictionary<char, Matcher>();
public StringValidator()
{
Matchers = new[]{
new Matcher('A', c => Char.IsLetter(c)),
new Matcher('N', c => Char.IsDigit(c)),
new Matcher('X', c => Char.IsLetter(c) || Char.IsDigit(c)),
new Matcher('-', c => c == '-')}
.ToDictionary(m => m.Flag);
}
public bool ValidateString(string strForMatching, string strTobeValidated)
{
if (strForMatching.Length != strTobeValidated.Length)
return false;
for(int i = 0; i < strTobeValidated.Length; i++)
{
Matcher matcher = GetMatcher(strForMatching[i]);
if (!matcher.DoesMatch(strTobeValidated[i]))
return false;
}
return true;
}
private Matcher GetMatcher(char flag)
{
Matcher matcher;
if(!Matchers.TryGetValue(flag, out matcher))
throw new IndexOutOfRangeException(String.Format("No matcher for character '{0}'", flag));
return matcher;
}
}
Теперь, как вы идете по поводу выбирая создание соответствующих подпрограмм или организуя их, или их флаги зависят от вас. В этом случае StringValidator
имеет свои правила «жестко закодированные», но вы можете изменить это, чтобы передать их через конструктор или изменить с помощью общедоступных методов.
Кроме того, правила, которыми я пользуюсь Char.IsLetter
и Char.IsDigit
, которые немного отличаются от простых «A-Z» и «0-9», но этого должно быть достаточно, чтобы продемонстрировать, как это работает. Не стесняйтесь заменять эти конкретные проверки регулярным выражением или другой проверкой, если хотите.
Кроме того, ваш пример правил/выходов казался выключенным (например, я ожидал бы «PPP12AA-9876» до не матч против «AAAAXXXXX-NNNN-AA»). В настоящее время проверяется, соответствуют ли длины, но вы можете избавиться от этого. И если шаблон соответствия короче ввода для проверки (или наоборот), я не был уверен в этом, поэтому я оставлю это вам как упражнение, основанное на ваших точных требованиях.
Некоторые использования образца:
string[] stringsToValidate = new string[] {
"333TEST",
"TEST4444-1234-AB",
"ABCD12AB-1234-99",
"ABCD2345-1234-AB",
"PPP12AA-9876"
};
string strForMatching = "AAAAXXXX-NNNN-AA";
var validator = new StringValidator();
foreach(var strToValidate in stringsToValidate)
{
bool isValid = validator.ValidateString(strForMatching, strToValidate);
Console.WriteLine(strToValidate + ": " + isValid);
}
Выходы:
333TEST: Ложные
TEST4444-1234-AB: Правда
ABCD12AB-1234-99: Ложные
ABCD2345-1234- AB: True
PPP12AA-9876: False
попробуйте использовать регулярные выражения: http://en.wikipedia.org/wiki/Regular_expression – pascalhein
Я использую приложение Windows – Rocky
'Я использую приложение Windows 'Итак? просто используйте ['System.Text.RegularExpressions'] (http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.aspx) в вашем приложении Windows. Они не являются взаимоисключающими. – Nolonar