使用正则表达式实时验证和格式化文本框输入

时间:2015-08-21 13:25:25

标签: c# regex wpf

我有WPF应用程序,用户可以使用USB更改连接到计算机的产品的产品编号。产品上的标签以此格式列出产品编号:111 22 33-44。

今天,用户只能在文本框中输入数字(111223344)。使用检查九位数的正则表达式验证输入。但现在客户希望用户能够:

  1. 仅将数字作为数字输入,并在键入字符串时格式化字符串。当用户键入“1112”时,它应自动在文本框中格式化为“111 2”,依此类推。当用户输入所有九位数时,它应该看起来像111 22 33-44
  2. 输入贴在标签上的数字(带空格等)。
  3. 但与此同时,产品编号必须经过验证才能包含九位数字。空格和“ - ”必须是不可见的

    我可以在代码中轻松解决这个问题,但问题是这个验证/格式化必须在配置文件中完全配置。本应用程序可以提供各种类别的产品,产品编号的格式可能会有所不同。

    这是否可以通过正则表达式以相当简单的方式解决?我真的看不出如何将两者结合起来,验证和格式化:

    • ^ \ d {9} $ - 用于验证九位数字
    • (\ ​​W {3})(\ W {2})?(\ W {2})?(\ W {2})? - 与替换模式一起格式化$ 1 $ 2 $ 3- $ 4。然而,这种模式只能格式化九个数字,没有空格和“ - ”

    有什么建议吗?

    修改

    似乎我需要使用至少三个正则表达式模式才能实现:

    1. 用于验证有效的产品编号(不是显示值)。它是9位数吗?
    2. 用于格式化显示值(123456789 = 123 45 67-89)
    3. 从格式化(空白和 - )
    4. 中删除添加的字符

      也许更简单的解决方案是保持当前验证(例如^ \ d {9} $)验证原始值,然后只需添加一个名为DisplayMask的设置,负责配置的人员可以进入像这样的东西:

      • “### ## ## - ##”

      然后我编写使用此掩码的代码来格式化显示值。这有几个好处:

      1. 对于负责配置的人员非常容易理解
      2. 这也使我能够通过简单地获取displaymask并删除所有#来轻松检索需要从输入值中删除的所有字符。剩下的字符是在将产品编号写入产品硬件之前必须从产品编号中删除的字符。
      3. 还可以很容易地设置文本框的最大长度。产品编号原始值的最大长度+显示掩码中添加的字符数。

3 个答案:

答案 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;
}
相关问题