将基本 Access 查询条件表示为正则表达式



我熟悉 Access 的查询和筛选条件,但我不确定如何将类似的语句表示为正则表达式模式。我想知道是否有人可以帮助将它们与我理解的一些简单示例联系起来。

如果我使用正则表达式来匹配 Access 等字段,我将如何表达以下语句?示例类似于此访问查询和筛选条件网页上的示例。与 Access 一样,大小写不敏感。

  1. "伦敦">

    单词"伦敦"完全匹配的字符串。

  2. ">
  3. 伦敦"或"巴黎">

    单词"伦敦"或"巴黎"完全匹配的字符串。

  4. 不是"伦敦">

    除伦敦以外的任何字符串。

  5. 像"S*">

    任何以字母 s 开头的字符串。

  6. 像"*st">

    任何以字母 st 结尾的字符串。

  7. 像"*狗*">

    包含单词"the"和"dog"的任何字符串,在之前、中间或结尾包含任何字符。

  8. 像"[A-D]*">

    任何以字母 A 到 D 开头的字符串,后跟任何其他字符串。

  9. 不像"*伦敦*">

    任何不包含单词 London 的字符串。

  10. 不像"L*">

    任何不以 L 开头的字符串。

  11. 像"L*">
  12. 而不是"伦敦*">

    任何以字母 L 开头但不以单词 London 开头的字符串。

Regex 比您习惯用于在 Access SQL 中创建条件的任何模式都要强大得多。如果您将自己限制在这些类型的模式中,您将错过正则表达式中大多数真正有趣的功能。

例如,您无法搜索日期或提取 IP 地址、简单的电子邮件或 URL 检测或验证、基本参考代码验证(例如询问订单参考代码是否遵循强制编码结构,例如PO123/C456之类的内容(等。

正如@Smandoli提到的,你最好忘记你对模式匹配的先入之见,潜入正则表达式语言。

我发现《掌握正则表达式》一书非常宝贵,但工具是自由试验正则表达式模式的最佳选择;我使用正则表达式好友,但还有其他可用的工具。

基本匹配

现在,关于您的列表,并使用相当标准化的正则表达式语法:

  1. "伦敦">

    单词"伦敦"完全匹配的字符串。

    ^London$

  2. ">
  3. 伦敦"或"巴黎">

    单词"伦敦"或"巴黎"完全匹配的字符串。

    ^(London|Paris)$

  4. 不是"伦敦">

    除伦敦以外的任何字符串。

    您匹配^London$并反转结果 ( NOT (

  5. 像"S*">

    任何以字母 s 开头的字符串。

    ^s

  6. 像"*st">

    任何以字母 st 结尾的字符串。

    st$

  7. 像"*狗*">

    包含单词"the"和"dog"的任何字符串,在之前、中间或结尾包含任何字符。

    the.*dog

  8. 像"[A-D]*">

    任何以字母 A 到 D 开头的字符串,后跟任何其他字符串。

    ^[A-D]

  9. 不像"*伦敦*">

    任何不包含单词 London 的字符串。

    反转London的匹配结果(您可以使用负前瞻,例如:
    ^(.(?!London))*$,但我认为它不适用于 Access 可用的更基本的正则表达式引擎(。

  10. 不像"L*">

    任何不以 L 开头的字符串。

    ^[^L]单个字符的负匹配比我们上面看到的整个单词的负匹配更容易。

  11. 像"L*">
  12. 而不是"伦敦*">

    任何以字母 L 开头但不以单词 London 开头的字符串。

    ^L(?!ondon).*$

在 SQL 条件中使用正则表达式

在 Access 中,创建可直接在 SQL 查询中使用的用户定义函数很容易。
要在查询中使用正则表达式匹配,请将此函数放在模块中:

' ----------------------------------------------------------------------'
' Return True if the given string value matches the given Regex pattern '
' ----------------------------------------------------------------------'
Public Function RegexMatch(value As Variant, pattern As String) As Boolean
    If IsNull(value) Then Exit Function
    ' Using a static, we avoid re-creating the same regex object for every call '
    Static regex As Object
    ' Initialise the Regex object '
    If regex Is Nothing Then
        Set regex = CreateObject("vbscript.regexp")
        With regex
            .Global = True
            .IgnoreCase = True
            .MultiLine = True
        End With
    End If
    ' Update the regex pattern if it has changed since last time we were called '
    If regex.pattern <> pattern Then regex.pattern = pattern
    ' Test the value against the pattern '
    RegexMatch = regex.test(value)
End Function

然后,您可以在查询条件中使用它,例如在 PartTable 表中查找与screw 18mm变体(如Pan Head Screw length 18 mm甚至SCREW18mm等(匹配的所有部分。

SELECT PartNumber, Description
FROM   PartTable
WHERE  RegexMatch(Description, "screw.*?d+s*mm")

警告

  • 由于正则表达式匹配使用旧的脚本库,因此正则表达式语言的风格比 .Net 中可用于其他编程语言的风格更受限制。
    它仍然相当强大,因为它或多或少与JavaScript使用的相同。
    阅读有关 VBScript 正则表达式引擎的信息,以检查您可以做什么和不能做什么。

  • 更糟糕的是,使用此库的正则表达式匹配可能相当慢,您应该非常小心不要过度使用它。

也就是说,它有时非常有用。例如,我使用正则表达式来清理来自用户的数据输入,并检测具有本应规范化的类似模式的条目。
如果使用得当,正则表达式可以增强数据一致性,但要谨慎使用。

则表达式最初很难闯入。 老实说,寻找勺子喂的例子不会像"弄脏你的手"那样有帮助。 此外,MS Access不是一个很好的跳板。 正则表达式与SQL查询过程不能很好地"同源"——不是在应用程序中,也不是在心理取向中。 您需要的是使用文本编辑器处理一些文本文件。

我们的解决方案是在OpenCalc(Apache OpenOffice,https://www.openoffice.org/的一部分(中打开Excel文件,该文件为查找和替换提供了似乎是完整的正则表达式。

我们在 http://regexr.com/测试正则表达式