首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于regex的文本框输入的实时验证和格式化

基于regex的文本框输入的实时验证和格式化
EN

Stack Overflow用户
提问于 2015-08-21 13:25:24
回答 3查看 3K关注 0票数 0

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

今天,用户只能在文本框中输入数字(111223344)。输入由检查九位数的regex验证。但是现在客户端希望用户能够:

  1. 输入数字仅为数字,并在输入字符串时设置格式。当用户输入"1112“时,应该在文本框中自动将其格式化为"111 2”等等。当用户输入所有九位数时,应该是111、22、33-44。
  2. 在贴纸上输入数字(有空格等)。

但同时,产品编号必须经过验证才能包含9位数字。空间和"-“必须是看不见的

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

用regex可以很容易地解决这个问题吗?我真的不知道如何将两者结合起来,验证和格式化:

  • ^\d{9}$ -用于验证九位数
  • (\W{3})?(\W{2})?(\W{2})?(\W{2})?与替换模式$1 $2 $3-$4一起格式化?

有什么建议吗?

编辑:

似乎我需要至少使用三种正则表达式模式才能工作:

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

也许更简单的解决方案是保留验证原始值的当前验证(例如^\d{9}$),然后简单地添加一个名为DisplayMask的设置,负责配置的人员可以输入如下内容:

  • "### ##-#“

然后编写使用此掩码格式化显示值的代码。这有几个优点:

  1. 对于负责配置的人员来说非常容易理解。
  2. 这也将使我能够轻松地检索所有需要从输入值中删除的字符,只需获取显示掩码并删除所有#。剩下的字符必须从产品编号中删除,然后才能写入产品硬件。
  3. 也使得设置文本框的最大长度变得非常容易。产品编号的最大长度,原始值+从显示掩码中添加的字符数。
EN

回答 3

Stack Overflow用户

发布于 2015-08-21 13:36:29

看看这个Regex in PreviewTextInput: only decimals between 0.0 and 1.0

您可以在这里使用PreviewTextInput事件,然后使用Regex.Replace设置格式,下面是一个示例

代码语言:javascript
复制
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);
票数 0
EN

Stack Overflow用户

发布于 2015-08-21 13:47:55

如果您想使此可配置,关键是 class中的System.Text.RegularExpressions命名空间。

然后,可以很容易地将正则表达式存储在外部配置文件中,并用于匹配,例如Regex.IsMatch(),特别是IsMatch(string, string)

票数 0
EN

Stack Overflow用户

发布于 2015-08-21 14:17:26

首先,在对文本进行格式化之后,您将有一个长度为12的条目。我将设置TextBox.MaxLength = 12以限制可以输入的数据量。

就验证而言,可能有一种“更干净”的方法,但首先您可以使用一系列Regex.IsMatch()条件来自动格式化输入。

例如:

代码语言:javascript
复制
1112       => 111 2
111 223    => 111 22 3
111 22 334 => 111 22 33-4

然后进行最后一次Regex.IsMatch()检查,确认输入的格式为

代码语言:javascript
复制
### ## ##-##

代码示例:

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32141493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档