如果您希望它是动态构建的,那么我将完全避免使用正则表达式。构建一些对象来为您完成工作。
首先是一个非常简单的类,用于通过任意匹配检查来验证单个字符:
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
超出简单的“AZ”和“0-9”,但应该足以证明它是如何工作的。如果您愿意,请随意用正则表达式或其他检查替换这些特定检查。
此外,您的示例规则/输出似乎不正确(例如,我希望“PPP12AA-9876”与“AAAAXXXX-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:正确
PPP12AA-9876:错误