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

时间:2012-05-01 03:09:31

标签: regex ms-access vba

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

如果我使用正则表达式匹配Access等字段,我将如何表达以下语句?示例与此Access Query and Filter Criteria网页上的示例类似。与Access一样,案例不敏感。

  1. “伦敦”

    完全符合伦敦一词的字符串。

  2. “伦敦”或“巴黎”

    完全符合伦敦或巴黎字样的字符串。

  3. 不是“伦敦”

    任何字符串,但伦敦。

  4. 喜欢“S *”

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

  5. 喜欢“* st”

    任何以字母st。

  6. 结尾的字符串
  7. 喜欢“* the * dog *”

    任何包含“the”和“dog”字样的字符串,包含之前,之间或结尾处的任何字符。

  8. 喜欢“[A-D] *”

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

  9. 不喜欢“*伦敦*”

    任何不包含“伦敦任何地方”字样的字符串。

  10. 不喜欢“L *”

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

  11. 喜欢“L *”而不喜欢“伦敦*”

    任何以字母L开头但不以伦敦字开头的字符串。

3 个答案:

答案 0 :(得分:14)

正则表达式比您用于在Access SQL中创建条件的任何模式更强大。如果你限制自己使用这些类型的模式,你将会错过正则表达式的大部分真正有趣的功能。

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

正如@Smandoli所提到的,你最好忘记你对模式匹配的偏见并深入研究正则表达式语言。

我发现这本书Mastering Regular Expressions非常宝贵,但工具最适合自由地使用正则表达式模式进行实验;我使用RegexBuddy,但有other tools available

基本匹配

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

  1. “伦敦”

    完全符合伦敦一词的字符串。

    ^London$

  2. “伦敦”或“巴黎”

    完全符合伦敦或巴黎一词的字符串。

    ^(London|Paris)$

  3. 不是“伦敦”

    任何字符串,但伦敦。

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

  4. 喜欢“S *”

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

    ^s

  5. 喜欢“* st”

    任何以字母st。

    结尾的字符串

    st$

  6. 喜欢“* the * dog *”

    任何包含“the”和“dog”字样的字符串,包含之前,之间或结尾处的任何字符。

    the.*dog

  7. 喜欢“[A-D] *”

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

    ^[A-D]

  8. 不喜欢“*伦敦*”

    任何字符串都不包含伦敦任何地方。

    撤消London的匹配结果(您可以使用negative lookahead,例如:
    ^(.(?!London))*$,但我不认为可用于Access的更基本的Regex引擎。

  9. 不喜欢“L *”

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

    正如我们上面所见,单个字符的

    ^[^L]负匹配比整个字的负匹配更容易。

  10. 喜欢“L *”而不喜欢“伦敦*”

    任何以字母L开头但不以伦敦字开头的字符串。

    ^L(?!ondon).*$

  11. 在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甚至{ {1}}等等。

    SCREW18mm

    买者

    • 因为正则表达式匹配使用旧的脚本库,所以Regex语言的风格比.Net中可用于其他编程语言的语言更有限。
      它仍然相当强大,因为它与JavaScript使用的或多或少相同 阅读VBScript regex engine以了解您可以做什么和不能做什么。

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

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

答案 1 :(得分:3)

正则表达式最初很难打破。老实说,寻找用勺子喂养的例子并没有像使用它“弄脏手”那样多。此外,MS Access不是一个好的跳板。正则表达式不能很好地“同意”SQL查询过程 - 不是在应用程序中,也不是在心理定向上。您需要的是使用文本编辑器处理的一些文本文件。

答案 2 :(得分:0)

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

我们在http://regexr.com/

测试正则表达式