为什么Regex不能在PreviewKeyDown上工作?

时间:2014-09-24 13:09:09

标签: c# regex

这是我的代码,以防止alphanumeric之外的所有字符。但这不起作用。

private void LoginUsername_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (Regex.IsMatch(e.Key.ToString(), @"[^a-zA-Z0-9]"))
        {
           e.Handled = true;    // BreakPoint 'doesn't break'
        }

        if (e.Key == Key.Space)
        {
            e.Handled = true;   // BreakPoint 'breaks'
        }
    }

使用KeyDown Event>不起作用。

使用TextChange Event>工作得很好〜!

我甚至在BreakPoint中尝试PreviewKeyDown,但它从未到达e.Handle〜!

我错过了什么吗?

3 个答案:

答案 0 :(得分:3)

我会将e.Key投射到int并检查数值是否与您允许的符号匹配,而不是使用ToString()方法

答案 1 :(得分:1)

当您按下Space或Shift或Control之类的非字符键或者不仅仅是1个单个字符的所有内容时,e.Key会返回一个特殊的Enum值,当ToString()成为时(如果按下)空间)"空间"。 Regex.IsMatch(string, @"[^a-zA-Z0-9]")检查:"这是非字母数字字符"。但是,因为你没有在你的正则表达式中包含^和$来指示你需要匹配整个字符串,而不仅仅是一个子字符串,它基本上检查"所有字符都是非字母数字的吗?&#34 ;因为" Space"有字母数字字符,找不到匹配。

尝试使用正则表达式@"^[^a-zA-Z0-9]$",因为这会将整个字符串与非字母数字字符进行比较,而不仅仅是单个字符。

是的,正如tDragon建议的那样,与字符串的intvalue进行比较可能是一个可行的选择。

答案 2 :(得分:1)

我发现使用TextInput事件比KeyDown

更不复杂

所以,这是我的解决方案,让其他人受益:

private async void LoginUsername_PreviewTextInput(object sender, TextCompositionEventArgs e)
    {
        Char keyChar = (Char)System.Text.Encoding.ASCII.GetBytes(e.Text)[0];

        if (Regex.IsMatch(keyChar.ToString(), @"[^a-zA-Z0-9]"))
        {
            e.Handled = true;
        }
    }