[英]Match a string against an easy pattern
我正在嘗試將來對我正在創建的程序進行證明,以使需要用戶輸入的模式不會被硬編碼。 字母或數字的樣式總是有可能改變的,但是當它改變時,我需要每個人保持一致。 另外,我希望經理們能夠控制一切而不必依靠我。 是否可以使用正則表達式或其他字符串工具將輸入與數據庫中存儲的列表進行比較。 我希望它很容易,以便存儲在數據庫中的模式看起來像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));
使用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/zh-cn/library/system.windows.forms.maskedtextbox.mask
您可以將模式原樣存儲在數據庫中,然后將其轉換為正則表達式。
我不特別知道您需要使用哪種格式的字符,但讓我們假設您只想將數字替換為#
,而其余部分保持原樣,下面是一些代碼:
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;
}
這正在做我現在需要做的所有事情。 感謝所有提示。 將來我將不得不更多地研究正則表達式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.