在 REPLACE 函数中使用通配符的 MS Access

Posted

技术标签:

【中文标题】在 REPLACE 函数中使用通配符的 MS Access【英文标题】:MSAccess using a wildcard in the REPLACE function 【发布时间】:2019-01-26 16:09:30 【问题描述】:

我正在尝试做一些简单的事情,但我不明白为什么它不起作用。我真的是 MS Access VBA 的新手。

我在文本框中有一个字符串:

\\p9990cdc\C$\Temp

我想把它变成: C:\温度

我正在尝试:

strSelectedFile = Replace(strSelectedFile, "\\*\C$", "C:")

它不工作。

不知道为什么 RegEx 也不起作用:

strSelectedFile = Replace(strSelectedFile, "\\[\w]\C$", "C:")

一切都设置正确,所以问题完全在于替换代码,因为如果我尝试例如:

strSelectedFile = Replace(strSelectedFile, "C$", "C:")

它可以正常工作并成功地将 C$ 替换为 C:

\p9990cdc\C:\Temp

我怎样才能做到这一点?

非常感谢您的宝贵时间!

【问题讨论】:

【参考方案1】:

您可以改为使用Mid(Instr()) 查找$ 的索引并从那里获取字符串(减1 以保留目录字母)。

strSelectedFile = Replace(Mid(strSelectedFile, InStr(strSelectedFile, "$") - 1, Len(strSelectedFile)), "$", ":")

【讨论】:

太好了,它有效,非常感谢我的朋友!提醒我为什么我从不喜欢 VBA ;) 那么我应该明白替换功能不支持正则表达式或通配符吗? @Rakha Regex.Replace() 可以工作,但需要 a little bit more legwork 才能在 VBA 中工作。对于内置的Replace(),老实说我不确定但基本上没有examplesI've seen 以这种方式使用它。 谢谢。最后一个问题,我如何编写一个 IF 以便它只在字符串包含 \*\C$ 时进行替换? (* 表示任何意思)是否可以使用 RegEx 执行 IF,例如: "\[\w]\C$" ?非常感谢 @Rakha 只需搜索If Instr(strSelectedFile, "\C$") Then@Rakha 就能涵盖您的所有案例吗?【参考方案2】:

Replace 不使用通配符。您可以实现自己的功能,或使用 VBScript.RegEx 使用正则表达式。

我已经编写了一个小函数来为你做这件事。然而,性能并不理想,我只做了一点测试。它适用于您的示例输入。

Public Function LikeReplace(strInput As String, strPattern As String, strReplace As String, Optional start As Long = 1)
    Dim LenCompare As Long
    Do While start <= Len(strInput)
        For LenCompare = Len(strInput) - start + 1 To 1 Step -1
            If Mid(strInput, start, LenCompare) Like strPattern Then
                strInput = Left(strInput, start - 1) & strReplace & Right(strInput, Len(strInput) - (start + LenCompare - 1))
            End If
        Next
        start = start + 1
    Loop
    LikeReplace = strInput
End Function

使用您的输入并将Replace 与此LikeReplace 交换应该可以正常工作。

【讨论】:

感谢您的意见,非常有用【参考方案3】:

您可以只使用VBScript.RegEx 和正确的模式。

Public Function ReplacePattern(ByRef iString As String, iSearchPattern As String, iReplaceWith As Variant)
'---------------------------------------------------------------------------------------
' Procedure : ReplacePattern
' Purpose   : Searches a string by pattern and replaces the text with given value
' Returns   : Replaced string.
'---------------------------------------------------------------------------------------
'

    Dim RE As Object
    Set RE = CreateObject("VBScript.RegExp")

    RE.ignorecase  = True 
    RE.Global      = True

    RE.Pattern     = iSearchPattern
    iString        = RE.Replace(iString, iReplaceWith)
    ReplacePattern = iString

    On Error Resume Next
    Set RE = Nothing

End Function

阅读更多关于模式Here

模式:"^\\\\.*C\$" => 以 \\ 开头 + 除换行符 + C$ 之外的任意数量的任意字符

用法

??replacepattern("\\p9990cdc\C$\Temp","^\\\\.*C\$","C:") => C:\Temp

【讨论】:

以上是关于在 REPLACE 函数中使用通配符的 MS Access的主要内容,如果未能解决你的问题,请参考以下文章

在 T-SQL 中对字符范围使用通配符

如何使用 C# 在 MS-Access 中的查询中使用带有通配符的 LIKE 运算符

在 WHERE 子句中使用 REPLACE 检查拼写排列 - MS SQL

日期转换问题 MS 访问 SQL Server

大数据之Hive:正则表达式

pandas.DataFrame.replace 用通配符