【发布时间】: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",那就是成功了