我想验证 Access 表单中文本框中的条目。文本框后面的字段存储标识每个项目记录的项目编号。我们目前在文本框的 before_update 事件中有一个非常复杂的 Do While 循环,它成功地验证了事物,但我正在努力收紧我们的代码,并想了解如何进行更优雅的正则表达式验证。这是技术细节。
项目编号具有标准格式,例如 PJ17-14-000,分为三个块,用破折号分隔。这是每个块的规则。
第一个块是项目类型/财政年度块。前两个字符始终是字母字符,它们会发生变化以反映不同的高级项目类型。PJ、EL、RM、ER 是一些示例,但它们可以是任意两个 alpha 字符。然后接下来的两个字符始终是数字,并反映项目开始的财政年度。例如,PJ17-14-000 始于 2017 财年。
第二个区块只是一个数字,表明项目建立的顺序。因此,PJ17-1-000 是 2017 财年启动的第一个 PJ 项目。PJ17-2-000 是第二个。等等。这个数字的位数没有理论上的限制,但实际上它永远不会超过四位数。但是,这很重要,前导数字永远不能为零。所以我们永远不会使用像 PJ17-01-000 这样的项目编号,并且验证应该拒绝这样的编号。相反,分析师应该简单地输入 PJ17-1-000。
最后,最后一个块始终是代表子项目的三个数字字符。大多数项目只有一个部分(没有子项目),所以最后一个块就是 000。但有些项目有很多子项目,所以它们可能有 PJ17-1-001、PJ17-1-002、PJ17-1-003(等等上)记录。对于第三个块,数字可以(并且通常确实)有前导零。
这些是项目编号本身的规则。这是有趣的部分:我们的数据库允许分析师在项目字段中输入以空格分隔的多个项目编号。(我知道有一种使用链接表和子表单的更好的设计,但这是我们的遗留系统。)为什么一个项目会有两个数字是一个很长很复杂的故事,但有时(通常)他们会这样做,我们必须允许为了那个原因。因此,项目编号字段可能需要(因此应该允许)汇总项目编号,例如“PJ17-1-000 ER16-143-000 PI16-23-000”。
因此,对于任何单个项目编号,验证都应遵循上述规则,并且应允许任意数量的项目编号以一个空格分隔。我该怎么做?
我开始玩 vbscript.regexp,但不知道如何解决这个复杂的问题。感谢有关如何使其工作的任何帮助,或您认为比我们当前的野兽更优雅且更易于阅读/维护的任何其他方法。
用
^[A-Z]{2}\d{2}-[1-9]\d*-\d+(?: [A-Z]{2}\d{2}-[1-9]\d*-\d+)*$
查看正则表达式演示
单项目代码模式是[A-Z]{2}\d{2}-[1-9]\d*-\d+
:
[A-Z]{2}
- 2 个大写 ASCII 字母(注意:如果这样的objRegEx.IgnoreCase = True
话,这也将匹配小写 ASCII 字母)\d{2}
- 2 位数字-
- 一个连字符[1-9]\d*
- 从1
to 开始的数字9
,然后是 0+ 任何数字-
- 一个连字符\d+
- 1 个或多个数字。整个模式是^<code>(?: <code>)*$
:
^
- 字符串的开始<code>
- 如上所述的项目代码模式(?: <code>)*
- 零个或多个序列:
- 空间<code>
- 如上所述的项目代码模式$
- 字符串的结尾。VBA代码:
Function IsProjCodeValid(s As String) As Boolean
Dim objRegEx As Object
Set objRegEx = CreateObject("VBScript.RegExp")
objRegEx.IgnoreCase = True
objRegEx.Pattern = "^[A-Z]{2}\d{2}-[1-9]\d*-\d+(?: [A-Z]{2}\d{2}-[1-9]\d*-\d+)*$"
IsProjCodeValid = objRegEx.Test(s)
End Function
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句