使用TextChanged属性的C#textBox十六进制只有0x / h / $前缀

时间:2014-11-20 03:58:14

标签: c# regex textbox hex prefix

我正在测试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不是边界犯罪BTW ..

感谢

1 个答案:

答案 0 :(得分:1)

您对这四行所做的是您将验证和更正结合起来,这在最好的情况下很困难,在许多情况下是不可能的。如果您真的想这样做,那么您首先必须验证输入。只有它无效才能修改它。

我建议您创建一个首先验证的正则表达式,如下所示:

Regex validInput = new Regex(@"^(\$|h|0x)?[0-9a-f]*", RegexOptions.IgnoreCase);
if (validInput.IsMatch(textBox1.Text))
{
    return;
}

如果你超越了这一点,那么你知道文本在某种程度上是坏的。如果你想纠正它,你必须确定 它的坏处。并且你不会用一个正则表达式来做那件事。您必须确定是否有有效的前缀。如果有效前缀,那么您可以检查文本的其余部分以查看它是否是有效的十六进制数字。如果没有有效的前缀,则检查整个字段以查看它是否为有效数字。

在您确定错误的位置后,您必须修复它。即使在你描述的简单案例中,这也很困难。

我认为你以完全错误的方式解决这个问题。

基本上有三种方法可以处理验证:

  1. 让用户输入他想要的任何文字。你把它标记为坏,但你保持原样并让用户改变它。
  2. 防止用户输入不允许的字符。例如,只允许他在数字输入字段中输入数字。
  3. 当用户输入错误数据时自动更正文字。
  4. 您已经选择了#3,这通常是最困难的(正如我上面所述),在我看来,作为用户,这是最烦人的选择。

    你遇到各种各样的问题。例如,假设用户已输入" 01AB",然后他返回到开头并键入" x",给出" x01AB"。但你不喜欢这样。你想要" 0x01AB",所以你删除" x"从字符串。用户认为,"嗯。我以为我按下了'。'。"所以他再试一次。在他发现你的代码如此有用之前,它需要进行两到三次尝试。阻止他输入不良数据。作为一个用户,我发现令人难以置信的烦恼,每当我遇到它时,我想找到编写它的程序员并锁定他,这样他就不能再次犯下这样的丑陋了。

    多年来,我发现第一个选择是最简单的代码,而且作为用户,最容易使用。如果用户输入错误数据,您可以轻松验证它并告知用户他犯了错误:通常是通过更改输入框周围的边框,在其旁边放置一个错误指示符,并可能显示一些文本说为什么输入是坏的以及如何纠正它。使用上面的例子:

    Regex validInput = new Regex(@"^(\$|h|0x)?[0-9a-f]*", RegexOptions.IgnoreCase);
    if (validInput.IsMatch(textBox1.Text))
    {
        // input is good. Clear errors.
        return;
    }
    // Input is bad. Show error indicator.
    

    现在,如果用户按下“确定”或“保存”按钮或其他任何内容,并且仍有不良数据,则必须抓住并采取相应措施(即不要让程序继续处理错误数据) )。但这比尝试纠正用户输入的内容要容易得多,而且它也不那么烦人了。