豁达的木耳 · 将增量刷新与数据流配合使用 - Power ...· 3 月前 · |
憨厚的篮球 · 基础类WVBase相关的JSAPI有哪些_移 ...· 1 年前 · |
着急的毛巾 · Java Cipher 加密 - 掘金· 1 年前 · |
追风的花生 · free(): double free ...· 1 年前 · |
我正在TextChanged属性中测试以下代码,以便只允许textBox中的HEX值,并且它工作得很好,还删除了与HEX模式不匹配的粘贴字符串,并将小写转换为大写,这正是我所需要的:
Regex nonhex = new Regex("[^0-9,a-f,A-F]");
int caret = textBox1.SelectionStart - textBox1.Text.Length;
textBox1.Text = nonhex.Replace(textBox1.Text, "").ToUpper();
textBox1.SelectionStart = caret + textBox1.Text.Length;
如果我尝试添加一个前缀,上面的代码就会删除它。为了允许添加一个永久前缀(比如0x,h,$),我只使用正则表达式和TextChnaged属性,那么修改代码的最佳方法是什么?我还需要能够指定HEX值的最大长度,例如PID和VID HID设备的4位数字,因为我可能在一些需要或多或少十六进制数字的不同项目中使用它。
我在论坛上寻找一个类似的解决方案,但大多数人使用不止一个事件,几乎没有达到这四行所能做到的。使用RegEx不是边线犯罪.
谢谢
发布于 2014-11-20 05:17:04
在这四行代码中,您所做的是将验证和更正结合起来,这在最好的情况下是困难的,在许多情况下是不可能的。如果您真的想这样做,首先必须验证输入。只有当它无效时,才能修改它。
我建议您创建一个将首先验证的正则表达式,如下所示:
Regex validInput = new Regex(@"^(\$|h|0x)?[0-9a-f]*", RegexOptions.IgnoreCase);
if (validInput.IsMatch(textBox1.Text))
return;
}
如果你越过了这个点,那么你就会知道这篇文章在某种程度上是不好的。如果你想纠正它,你必须确定它的坏地方。你不能用一个正则表达式来完成这个任务。您必须确定是否有有效的前缀。如果有一个有效的前缀,那么您可以检查文本的其余部分,看看它是否是一个有效的十六进制数字。如果没有有效的前缀,那么检查整个字段,看看它是否是一个有效的数字。
在您确定了错误所在之后,您就必须修复它。即使在你描述的简单案例中,这也是很困难的。
我觉得你这样做完全是错误的。
基本上有三种方法来处理验证:
您已经选择了#3,这通常是最困难的(正如我前面所描述的),在我看来,作为一个用户,这是最烦人的可能选项。
你遇到了各种各样的问题。例如,假设用户输入了"01AB",然后返回到开头,键入"x",给出"x01AB“。但你不喜欢这样。您需要"0x01AB",所以从字符串中删除"x“。用户想,“嗯,我以为我按了‘x’。”所以他再试一次。在他发现你的代码如此“有帮助”地阻止他输入坏数据之前,需要做两到三次尝试。作为一个用户,我发现这是令人难以置信的恼人之处,每当我遇到它时,我都想找到编写它的程序员,并将他锁起来,这样他就不会再犯这样的丑了。
多年来,我发现第一个选项是最容易编写代码的,而作为一个用户,它是最容易使用的。如果用户输入了错误的数据,您可以很容易地验证它,并通知用户他犯了错误:通常是通过更改输入框周围的边框,在输入框旁边放置一个错误指示器,并可能会显示一些文本,说明输入错误的原因以及如何纠正错误。用我上面的例子:
Regex validInput = new Regex(@"^(\$|h|0x)?[0-9a-f]*", RegexOptions.IgnoreCase);
着急的毛巾 · Java Cipher 加密 - 掘金 1 年前 |