65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Visual FA 进行数据验证

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2024年4月24日

MIT

2分钟阅读

viewsIcon

4062

如何验证字段,例如数据输入应用程序。

引言

虽然词法分析器通常用于将文本分解为标记,但它们也可以用于验证,这在字段可以具有多种有效格式,并且需要知道使用了哪种格式时特别有用。

背景

您可能需要阅读关于 Visual FA 的内容 此处

在这里,我们将使用运行时引擎来词法分析代码,尽管您可以轻松生成运行器而不是引用运行时库。

我们将要做的是探索字段验证。我们将验证一个字段,该字段可以是电子邮件地址或电话号码。我们将使用两个正则表达式来执行此操作,并从中构建一个词法分析器。然后,我们将使用运行器与词法分析器一起验证文本。

使用代码

首先,让我们看一下我们的字段验证例程

static int _Match(FARunner runner)
{
    var match = runner.NextMatch();
    if (match.IsSuccess && 
        runner.NextMatch().SymbolId == 
            FAMatch.EndOfInput)
    {
        return match.SymbolId;
    }
    return -1;
}

此例程接受任何类型的运行器并使用它来验证字段。它检查第一个标记是否为有效输入,然后下一个标记必须是输入结束符号才能有效。最后,它返回匹配的符号 ID,以便我们可以使用它来区分字段中的数据类型。

接下来是我们的测试例程,我们运行所有传入的字符串

static void _RunStrings(FAStringRunner runner, string[] strings)
{
    for (int i = 0; i < strings.Length; i++)
    {
        runner.Set(strings[i]);
        Console.Write("\"");
        Console.Write(strings[i]);
        Console.Write("\" is ");
        switch(_Match(runner))
        {
            case 0: Console.WriteLine("an email address"); break;
            case 1: Console.WriteLine("a phone number"); break;
            default:
                Console.WriteLine("not a valid input");
                break;
        }
        
    }
}

在这里,我们获取一个 FAStringRunner 和一些字符串。我们不能获取一个普通的 FARunner,因为我们需要能够 Set() 输入,而该函数在基类上不可用。

对于每个字符串,我们 Set() 运行器输入,写出带引号的字符串,然后写出它的输入类型。请注意,我们正在调用 _Match() 来获取已验证匹配的符号。

最后,我们使用入口点代码启动它

var strings = new string[]
            {
                "foo",
                "",
                "baz@bar.com",
                "(300) 555-1212"
            };
var email = FA.Parse(@"(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|""(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*"")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])", 0);
var phone = FA.Parse(@"(?:\+[0-9]{1,2}[ ])?\(?[0-9]{3}\)?[ \.\-][0-9]{3}[ \.\-][0-9]{4}", 1);
var lexer = FA.ToLexer(new FA[] { email, phone });
var runner = new FAStringStateRunner(lexer);
_RunStrings(runner, strings);

在这里,我们从正则表达式创建电子邮件地址和电话号码的状态机。正如您所看到的,电子邮件地址的正则表达式非常复杂。感谢互联网。请注意,我们为每个地址使用不同的接受 ID - 分别为零和一。

一旦我们有了这些,我们就从它们创建一个词法分析器,然后从该词法分析器创建一个状态运行器。然后,我们将它传递给 _RunStrings()

请原谅电子邮件正则表达式糟糕的换行。Visual FA 不支持多行表达式,因此这是必要的。

您可以在文章顶部提供的 GitHub 链接处的解决方案中找到 Validation 项目。

历史

2024年4月24日 - 初始提交

© . All rights reserved.