3

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

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

  1. “伦敦”

    与单词 London 完全匹配的字符串。

  2. “伦敦”或“巴黎”

    与单词 London 或 Paris 完全匹配的字符串。

  3. 不是“伦敦”

    任何字符串,但伦敦。

  4. 像“S*”

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

  5. 像“*st”

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

  6. 像“*the*dog*”

    任何包含单词 'the' 和 'dog' 以及之前、中间或结尾的任何字符的字符串。

  7. 像“[AD]*”

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

  8. 不像“*伦敦*”

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

  9. 不像“L*”

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

  10. 像“L*”而不像“London*”

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

4

3 回答 3

15

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

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

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

我发现Mastering Regular Expressions这本书非常宝贵,但工具是自由尝试正则表达式模式的最佳工具;我使用RegexBuddy,但还有其他可用的工具

基本匹配

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

  1. “伦敦”

    与单词 London 完全匹配的字符串。

    ^London$

  2. “伦敦”或“巴黎”

    与单词 London 或 Paris 完全匹配的字符串。

    ^(London|Paris)$

  3. 不是“伦敦”

    任何字符串,但伦敦。

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

  4. 像“S*”

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

    ^s

  5. 像“*st”

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

    st$

  6. 像“*the*dog*”

    任何包含单词 'the' 和 'dog' 以及之前、中间或结尾的任何字符的字符串。

    the.*dog

  7. 像“[AD]*”

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

    ^[A-D]

  8. 不像“*伦敦*”

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

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

  9. 不像“L*”

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

    ^[^L]正如我们在上面看到的,单个字符的否定匹配比整个单词的否定匹配更容易。

  10. 像“L*”而不像“London*”

    任何以字母 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 正则表达式引擎的信息,以检查您能做什么和不能做什么。

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

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

于 2012-05-01T08:37:30.957 回答
3

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

于 2012-05-01T03:31:36.147 回答
0

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

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

于 2016-08-15T18:55:05.153 回答