正则表达式无法过滤 WinForms 中的文本框字符

本文关键字:文本 字符 WinForms 过滤 正则表达式 | 更新日期: 2023-09-27 18:34:09

我想创建一个只接受正数或负数以及末尾任意数量的字符"k"的文本框(WinForms(,我认为模式^-?[0-9]+k*$

我想阻止用户编写与该表达式不匹配的任何字符。这是我实现的类:

public class NumTextBox : TextBox {
        private Regex regex;
        public NumTextBox() : base() {
            regex = new Regex(@"^-?[0-9]+k*$");
        }
        protected override void OnKeyPress(KeyPressEventArgs e) {
            String s = Text + e.KeyChar; // current text + new character
            if (!regex.Match(s).Success) {
                e.Handled = true;
            } else {
                e.Handled = false;
            }
            base.OnKeyPress(e);
        }
   }
}

有了这个,文本框不允许您在文本的开头写字符,但它允许您在某个数字之后写它们,我的意思是:

ASD -> 不允许

123asd -> 允许,这不应该被允许

我也尝试将结束字符添加到s但都不起作用。

编辑:我在调试器中看到字符串s末尾有新字符。

编辑 2

为什么不直接尝试分析文本框的文本值?

因为我想防止用户能够根据正则表达式写入不允许的字符。

代码还有其他一些问题: 1.如果用户开始输入负数,则由于(-(本身不匹配,则它应该不起作用。 2.如果文本为123并且用户在1和2之间单击然后按K怎么办?(按键不是一个好地方(

1:我认为你是对的,但我更喜欢现在解决这个问题,以后再处理。

2:数字之间不允许使用字母"k",只能在数字的末尾使用。

如果你调试你的代码,正则表达式是否匹配并单步执行e.Handled=true,或者是否匹配?此外,OnTextChanged 可能是更好的覆盖方法。

  1. 如果我调试代码,正则表达式匹配(说它是正确的(错误的字符串(例如 123asd(,因此它不会步入e.Handled = true

  2. 我认为您指的是覆盖OnTextChanged并删除与正则表达式不匹配的最后一个字符,不是吗?在这种情况下,我看到的一个问题是文本指针返回到开头。

正则表达式无法过滤 WinForms 中的文本框字符

我相信

你的问题就在这里:

string s = Text + e.KeyChar; // current text + new character

问题是它会附加新字符,而不考虑光标位置。 这意味着如果您转到字符串的开头并输入"k",则Handled不会触发,因为您说 + "k",这很好,根据正则表达式。

它远非完美,但您可以通过以下方式处理OnTextChanged,以满足您的需求。 我只对它进行了简短的测试,但据我所知,它似乎产生了所需的行为。

protected override void OnTextChanged(EventArgs e)
{
    if (string.IsNullOrEmpty(this.Text))
        return;
    int pos = this.SelectionStart;
    if (!regex.IsMatch(Text))
    {
        this.Text = _OldValue;
        this.SelectionStart = pos > 0 ? pos - 1 : pos;
    }
    else
        _OldValue = this.Text;
    base.OnTextChanged(e);
}

你可以看到我放了一个技巧来解决光标返回到字符串开头的问题,你在帖子或评论中解决了这个问题。

您可以做的是检查按下了哪个键,如果它是正确的,那么您应该添加它

对于您的示例是这样的:

int temp;
if(int.TryParse(e.KeyChar,out temp) || e.KeyChar == '-' || e.KeyChar == 'k')
{
//code
}