繁体   English   中英

正则表达式为什么不能在PreviewKeyDown上工作?

[英]Why doesn't Regex work on a PreviewKeyDown?

目前这是我的代码,以防止除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 >效果更好〜!

我什至在PreviewKeyDown尝试了BreakPoint ,但它从未命中e.Handle

我想念什么吗?

我将e.Keyint然后检查数字值是否与您允许的符号匹配,而不是使用ToString()方法

当您按下空格键或Shift键或Control键之类的非字符键或所有不只是1个单个字符的键时,e.Key将返回一个特殊的Enum值,完成后,该ToString()变为(如果您按空格键)“ Space”。 Regex.IsMatch(string, @"[^a-zA-Z0-9]")检查:“这是一个非字母数字字符”。 但是,由于您不在正则表达式中包含^和$来表示需要匹配整个字符串,而不仅仅是子字符串,因此它基本上会检查“所有字符都是非字母数字吗?”。 由于“空格”具有字母数字字符,因此找不到匹配项。

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

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

我发现使用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;
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM