如何在MS Access 2010中实现类似Oracle的正则匹配/替换功能?
在MS Access 2010中实现正则匹配与替换功能
你好呀!MS Access 2010确实没有内置像Oracle那样的REGEXP_MATCH或REGEXP_REPLACE函数,不过咱们可以通过VBA自定义函数来实现同样的效果,操作起来也不算复杂,我给你一步步讲清楚。
一、实现类似REGEXP_MATCH的正则匹配功能
Access本身没有原生的正则匹配函数,咱们可以写个VBA函数来替代:
- 打开你的Access数据库,按下
Alt + F11打开VBA编辑器。 - 在左侧的“项目资源管理器”里,右键点击你的数据库名称,选择插入 > 模块。
- 在新模块里粘贴下面的代码:
Function RegExpMatch(ByVal strInput As String, ByVal strPattern As String, Optional ByVal blnIgnoreCase As Boolean = True) As Boolean Dim objRegExp As Object Set objRegExp = CreateObject("VBScript.RegExp") With objRegExp .Pattern = strPattern .IgnoreCase = blnIgnoreCase .Global = False ' 只匹配一次,符合你示例里的精确匹配需求 End With RegExpMatch = objRegExp.Test(strInput) Set objRegExp = Nothing End Function
这个函数会检查输入字符串是否匹配指定的正则模式,返回True或False。默认不区分大小写,如果你需要区分的话,调用时传False即可。
示例用法(对应你的Oracle查询)
你原来的Oracle语句:
select * from table where regexp_match(name, '^foo$')
在Access里可以改成:
SELECT * FROM [table] WHERE RegExpMatch(name, '^foo$') = True
注意:table是Access的关键字,所以要加方括号[table]避免报错。
二、实现类似REGEXP_REPLACE的正则替换功能
同样在刚才的VBA模块里,添加下面的替换函数:
Function RegExpReplace(ByVal strInput As String, ByVal strPattern As String, ByVal strReplacement As String, Optional ByVal blnIgnoreCase As Boolean = True, Optional ByVal blnGlobal As Boolean = True) As String Dim objRegExp As Object Set objRegExp = CreateObject("VBScript.RegExp") With objRegExp .Pattern = strPattern .IgnoreCase = blnIgnoreCase .Global = blnGlobal ' 默认全局替换,只替换第一个匹配项的话传False End With RegExpReplace = objRegExp.Replace(strInput, strReplacement) Set objRegExp = Nothing End Function
这个函数可以把字符串中匹配正则的部分替换成你想要的内容。比如要把名称里的数字替换成XXX,可以这么写:
SELECT RegExpReplace(name, "\d+", "XXX") AS CleanedName FROM [table]
一些注意事项
- 保存模块时,模块名称不能和函数名重复,比如可以命名为
RegExpTools。 - Access用的是VBScript的正则语法,和Oracle的正则略有差异,但基础用法(比如你的
^foo$精确匹配)是完全兼容的。 - 如果数据库有宏安全限制,需要信任这个VBA项目才能运行函数:打开Access的「文件」>「选项」>「信任中心」>「信任中心设置」,调整宏安全级别或者添加当前数据库为信任位置。
内容的提问来源于stack exchange,提问作者user9525789
相关产品推荐
相关产品推荐

