使用 Visual FA 进行数据验证





5.00/5 (1投票)
如何验证字段,例如数据输入应用程序。
引言
虽然词法分析器通常用于将文本分解为标记,但它们也可以用于验证,这在字段可以具有多种有效格式,并且需要知道使用了哪种格式时特别有用。
背景
您可能需要阅读关于 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日 - 初始提交