我有WPF应用程序,用户可以使用USB更改连接到计算机的产品的产品编号。产品上的标签以此格式列出产品编号:111 22 33-44。
今天,用户只能在文本框中输入数字(111223344)。使用检查九位数的正则表达式验证输入。但现在客户希望用户能够:
但与此同时,产品编号必须经过验证才能包含九位数字。空格和“ - ”必须是不可见的
我可以在代码中轻松解决这个问题,但问题是这个验证/格式化必须在配置文件中完全配置。本应用程序可以提供各种类别的产品,产品编号的格式可能会有所不同。
这是否可以通过正则表达式以相当简单的方式解决?我真的看不出如何将两者结合起来,验证和格式化:
有什么建议吗?
修改
似乎我需要使用至少三个正则表达式模式才能实现:
也许更简单的解决方案是保持当前验证(例如^ \ d {9} $)验证原始值,然后只需添加一个名为DisplayMask的设置,负责配置的人员可以进入像这样的东西:
然后我编写使用此掩码的代码来格式化显示值。这有几个好处:
答案 0 :(得分:0)
看看这个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);
答案 1 :(得分:0)
如果您想使其可配置,则关键是System.Text.RegularExpressions
命名空间中的Regex
class。
然后可以轻松导入正则表达式并将其用于匹配,例如Regex.IsMatch()
,尤其是IsMatch(string, string)
。
答案 2 :(得分:0)
首先,在格式化文本后,您有一个长度为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;
}