通过 VBA 和正则表达式验证 Access 项目编号字段

艾米丽·贝丝

我想验证 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*- 从1to 开始的数字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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用带有Access和VBA的正则表达式匹配字符串

我如何通过钩子使用正则表达式验证反应中的输入字段

通过查看Python正则表达式编号

使用jQuery和正则表达式验证字段

通过正则表达式检查列列表是否包含标题 - Excel vba

特定的VBA / VBScript正则表达式相关问题(MS Access)

通过正则表达式C验证输入

通过Java正则表达式验证简单的SQL

捕获未通过正则表达式验证的字符

bash +通过正则表达式验证名称

通过Java中的正则表达式验证名称

通过javascript验证特定字符的正则表达式

通过javascript正则表达式验证SoundCloud URL

如何通过正则表达式使用加号(+)和“(0)”验证电话号码?

如何通过JavaScript正则表达式验证仅字母和空格输入

Word VBA-如何插入标题编号的引用;标题文字;列出项目编号和列出项目页码以进行评论?

正则表达式通过匹配段落中的参考编号来选择整个段落

Microsoft Access VBA:通过使用表达式组合文本值

正则表达式仅验证美国和印度的零售编号

正则表达式编号验证问题

需要编号验证正则表达式

使用 !用于正则表达式编号验证

IC编号验证需要正则表达式

通过反转现有应用的正则表达式来获取字段的实际值?

如何使用正则表达式通过 id 获取项目过滤器?

数组中每个邮件项目的Outlook VBA正则表达式

正则表达式验证小数字段为小时和分钟格式

如何通过正则表达式分隔的拆分功能将VBA中的字符串拆分为数组

用于表单字段验证的正则表达式