正则表达式无法过滤 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 可能是更好的覆盖方法。
如果我调试代码,正则表达式匹配(说它是正确的(错误的字符串(例如 123asd(,因此它不会步入
e.Handled = true
。我认为您指的是覆盖
OnTextChanged
并删除与正则表达式不匹配的最后一个字符,不是吗?在这种情况下,我看到的一个问题是文本指针返回到开头。
你的问题就在这里:
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
}