Regex是一个强大的工具,可让您检查是否符合给定的面罩。
从该版本开始, .NET 7.0 引入了对源生成器 RegexGenerator的支持- 我在代码中使用它。
为了深入了解上下文,我们来验证的电话号码PhoneNumberTextBox。
例如,如果给出以下内容Regex:
/// <summary>
/// <see cref="Regex"/>, которому соответствует только формат "+7 (XXX) XXX-XX-XX"
/// </summary>
/// <returns>Соответствие маске номера телефона</returns>
[GeneratedRegex(@"^\+7 \(\d{3}\) \d{3}-\d{2}-\d{2}$")]
private static partial Regex PhoneNumberOnlyRegex();
以及验证方法如下:
/// <summary>
/// Метод, проверяющий соответствие текста заданному <see cref="Regex"/>
/// </summary>
/// <param name="Text">Проверяемый текст</param>
/// <param name="Regex">Проверяющий <see cref="Regex"/></param>
/// <returns>Значение <see cref="bool"/> соответствия текста маске</returns>
private static bool IsTextAllowed(string Text, Regex Regex)
{
return Regex.IsMatch(Text);
}
然后我们可以像这样使用这个方法:
if (!IsTextAllowed(PhoneNumberTextBox.Text, PhoneNumberOnlyRegex()))
{
PhoneNumberTextBox.BorderBrush = Brushes.Red;
}
这种方法一直有效,直到我们必须检查输入序列而不是整个字符串的正确性。这就是问题出现的时候。
例如:
线路+ 7 (000) 000-00-00将接通Regex,但是如果您需要检查用户拨打的电话号码是否正确怎么办?他一拨通+, Regex 就会开始咒骂。
在某些情况下这可能看起来是一个小问题,但是如果开发者需要控制用户输入的每个字符,UI防止用户输入错误的字符怎么办?例如,通过事件PreviewTextInput和 Pasting元素TextBox?
顺便说一句,该事件还出现了另一个问题PreviewTextInput:它不处理用户输入的空格,而仅对输入的字符做出反应。这种情况该怎么办?
对于最终验证,请使用正则表达式。
检查部分输入使用
查看正则表达式如何工作的示例。
为了解决这个问题,我建议引入术语“严格”和“非严格”掩码。我的意思是:
Regex。在这种情况下,一个掩码可以在用户完成输入的阶段检查电话号码的正确性以及不存在错误字符;要实施您的计划,您可以执行以下操作:
IsTextAllowedPreviewTextInput:PreviewKeyDown它将充当空白处理程序:PhoneNumberTextBox_Pasting:PhoneNumberOnlyRegex():最终如何运作:
用户只能输入:
+,(,);-,(空格);11数字您可以轻松插入样本
+7 (000) 000-00-00,将其从()数字中删除并写入其他样本。该面具是“智能”的 - 它尊重打字顺序,并允许您仅输入一定数量的数字,同时观察标志。也就是说,你不能这样做:
但你可以这样做,因为输入顺序没有被违反:
正如您所看到的,没有什么可以阻止您将逐步检查和 全面检查结合起来😄
更新:向用户@Wiktor Stribiżew致以大大的“Dziękuję”(谢谢),没有他出色的掩码,我就不会改进我的答案 - 为此他收到了我的“+”😀