【问题标题】:Regex to mask Textbox text?正则表达式来屏蔽文本框文本?
【发布时间】:2021-03-24 20:33:40
【问题描述】:

我想防止用户在文本框中输入错误的文本。

允许输入的模式应该只有 XXXX-XXXX。仅前 4 个字符数字,以“-”字符开头并以 4 个字母结尾(不区分大小写)。

示例: 1234-abCd(正确) 12A4-abcd(错误,前4位一个字母) 12345abcd(错误,“-”缺失) 等等

我正在考虑使用正则表达式匹配 PreviewTextInput 中的文本框文本,如下所示:

private void _txt_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
    var txt = (TextBox)sender;
    Regex regex = new Regex(@"^[^0-9]{4}\-[^a-z]{4}");
    e.Handled = regex.IsMatch(txt.Text + e.Text);
}

如果文本与正则表达式不匹配,则应阻止在文本框中输入。 我的意思是即使在打字时 - 甚至不应该出现“123A”,也不应该允许在位置 4 输入“A”。

抱歉我的正则表达式知识不好,我还在学习它。

这可以用正则表达式完成吗?如何?

【问题讨论】:

  • 好吧,在打字时,您只有 1、2、3 ... 个字符,这与您期望的 9 个字符不匹配。使用 Regex 和 e.Handled 无法轻松实现这一目标
  • 请注意,^[^0-9]{4}-[^a-z]{4} 是 2 个否定字符类,它们匹配除第一个字符 0-9 以外的任何字符和第二个字符以外的任何字符。我想你的意思是^[0-9]{4}-[a-zA-Z]{4}
  • 正如@ThomasWeller 正确指出的那样,您在应用正则表达式 as 时遇到问题,输入被键入文本框。此问题的一种可能解决方案是为 1 到 9 个字符的每个长度创建不同的正则表达式。在您的句柄事件中,检查输入的长度并为输入的数据选择正则表达式。最终,您需要确保将最终长度和“最终”正则表达式应用于最终输入值。
  • 或者(参考@quaabaam 对 9 个正则表达式的建议),创建一个完美匹配字符串。输入每个字符时,将文本框中的内容与最后一个 (9-currentLength) 字符连接起来,并与一个正则表达式匹配。完美的是"1234-ABcd"。然后,在输入三个字符后(例如"12b"),将其与perfect.Substring(3)(即"4-ABcd")连接产生"12b4-ABcd",这会导致失败。如果他们输入了"987",那么结果就是"9874-ABcd",那就是成功了

标签: c# regex wpf


【解决方案1】:

我一直想知道为什么每个人都认为 Regex 可以神奇地解决问题,尤其是输入验证;)

首先,将您的问题分解为 Regex 可以匹配的实际模式:

  • 1-4 位数
  • 4 位数字,以 - 结尾,0-4 个字母

然后为这些创建正则表达式

  • ^\d{1,4}$
  • ^\d{4}-[A-z]{0,4}$

将它们组合起来

  • ^\d{1,4}$|^\d{4}-[A-z]{0,4}$

只要输入有效(根据您的规范),此正则表达式就应该匹配。如果不够,请重复并改进。

这里有一些测试用例

请注意:这只会阻止用户输入您不想要的字符。它不会阻止他们将随机字符串复制到文本框中。

附加建议:您不应假设输入 i 正确,因为您会阻止用户输入您不想要的内容。稍后始终在您的业务逻辑中检查输入(例如,添加新条目/项目/等时)。

【讨论】:

  • 感谢您的回答。我也需要处理一些钥匙,但你的例子有效。再次感谢:)
猜你喜欢
  • 1970-01-01
  • 2016-06-14
  • 2014-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
相关资源
最近更新 更多