我有WPF应用程序,用户可以更改与USB连接到计算机上的产品的产品编号。产品上的标签以这种格式列出产品编号: 111、22、33-44.
今天,用户只能在文本框中输入数字(111223344)。输入由检查九位数的regex验证。但是现在客户端希望用户能够:
但同时,产品编号必须经过验证才能包含9位数字。空间和"-“必须是看不见的
我本可以在代码中轻松地解决这个问题,但这里的问题是,这种验证/格式化必须在配置文件中完全可配置。该应用程序可以提供各种类型的产品,并且产品编号的格式可能会有所不同。
用regex可以很容易地解决这个问题吗?我真的不知道如何将两者结合起来,验证和格式化:
有什么建议吗?
编辑:
似乎我需要至少使用三种正则表达式模式才能工作:
也许更简单的解决方案是保留验证原始值的当前验证(例如^\d{9}$),然后简单地添加一个名为DisplayMask的设置,负责配置的人员可以输入如下内容:
然后编写使用此掩码格式化显示值的代码。这有几个优点:
发布于 2015-08-21 13:36:29
看看这个Regex in PreviewTextInput: only decimals between 0.0 and 1.0
您可以在这里使用PreviewTextInput事件,然后使用Regex.Replace设置格式,下面是一个示例
string inputStr = "111223";//e.Text;
inputStr = Regex.Replace(inputStr, @"\D", string.Empty);
if (inputStr.Length > 0)
{
inputStr = inputStr.Substring(0, Math.Min(9, inputStr.Length));
List<string[]> tmp = new List<string[]>() { new string[] { "7", "-" }, new string[] { "5", " " }, new string[] { "3", " " } };
foreach (var arr in tmp)
{
inputStr = Regex.Replace(inputStr, @"(?<=^\d{" + arr[0] + "})", arr[1]);
}
}
Console.WriteLine(inputStr);发布于 2015-08-21 13:47:55
如果您想使此可配置,关键是 class中的System.Text.RegularExpressions命名空间。
然后,可以很容易地将正则表达式存储在外部配置文件中,并用于匹配,例如Regex.IsMatch(),特别是IsMatch(string, string)。
发布于 2015-08-21 14:17:26
首先,在对文本进行格式化之后,您将有一个长度为12的条目。我将设置TextBox.MaxLength = 12以限制可以输入的数据量。
就验证而言,可能有一种“更干净”的方法,但首先您可以使用一系列Regex.IsMatch()条件来自动格式化输入。
例如:
1112 => 111 2
111 223 => 111 22 3
111 22 334 => 111 22 33-4然后进行最后一次Regex.IsMatch()检查,确认输入的格式为
### ## ##-##代码示例:
private void textBox1_TextChanged(object sender, EventArgs e)
{
string text = textBox1.Text;
if (Regex.IsMatch(text, "\\d{4}"))
{
textBox1.Text = Regex.Replace(text, "(\\d{3})(\\d)", "$1 $2");
}
else if (Regex.IsMatch(text, "\\d{3} \\d{3}"))
{
textBox1.Text = Regex.Replace(text, "(\\d{3} \\d{2})(\\d)", "$1 $2");
}
else if (Regex.IsMatch(text, "\\d{3} \\d{2} \\d{3}"))
{
textBox1.Text = Regex.Replace(text, "(\\d{3} \\d{2} \\d{2})(\\d)", "$1-$2");
}
else if (!Regex.IsMatch(text, "\\d{3} \\d{2} \\d{2}-\\d{2}"))
{
// Invalid entry
}
// Keep the cursor at the end of the input
textBox1.SelectionStart = textBox1.Text.Length;
}https://stackoverflow.com/questions/32141493
复制相似问题