正则表达式比您在 Access SQL 中用于创建条件的任何模式都强大得多。如果您将自己局限于这些类型的模式,您将错过正则表达式的大部分真正有趣的功能。
例如,您无法搜索日期或提取 IP 地址、简单的电子邮件或 URL 检测或验证、基本参考代码验证(例如询问订单参考代码是否遵循强制编码结构,例如类似的内容PO123/C456
)等内容, ETC。
正如@Smandoli 所提到的,您最好忘记对模式匹配的先入之见,并深入研究正则表达式语言。
我发现Mastering Regular Expressions这本书非常宝贵,但工具是自由尝试正则表达式模式的最佳工具;我使用RegexBuddy,但还有其他可用的工具。
基本匹配
现在,关于您的列表,并使用相当标准化的正则表达式语法:
“伦敦”
与单词 London 完全匹配的字符串。
^London$
“伦敦”或“巴黎”
与单词 London 或 Paris 完全匹配的字符串。
^(London|Paris)$
不是“伦敦”
任何字符串,但伦敦。
您匹配^London$
并反转结果 ( NOT
)
像“S*”
任何以字母 s 开头的字符串。
^s
像“*st”
任何以字母 st 结尾的字符串。
st$
像“*the*dog*”
任何包含单词 'the' 和 'dog' 以及之前、中间或结尾的任何字符的字符串。
the.*dog
像“[AD]*”
任何以字母 A 到 D 开头的字符串,后跟任何其他字符串。
^[A-D]
不像“*伦敦*”
任何不包含单词 London 的任何字符串。
反转匹配结果London
(您可以使用负前瞻,例如:
^(.(?!London))*$
,但我认为它不适用于 Access 可用的更基本的 Regex 引擎)。
不像“L*”
任何不以 L 开头的字符串。
^[^L]
正如我们在上面看到的,单个字符的否定匹配比整个单词的否定匹配更容易。
像“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")
警告
也就是说,它有时非常有用。例如,我使用正则表达式来清理来自用户的数据输入,并检测具有相似模式的条目,这些模式应该被规范化。
使用得当,正则表达式可以增强数据一致性,但要谨慎使用。