仅替换 VBA 中字符串中最后一次匹配的匹配项
Posted
技术标签:
【中文标题】仅替换 VBA 中字符串中最后一次匹配的匹配项【英文标题】:Replace only last occurrence of match in a string in VBA 【发布时间】:2014-08-15 04:47:36 【问题描述】:我有一个这样的字符串
“C://Documents/TestUser/WWW/Help/Files/Move_Help.txt”
并且必须将Move_Help.txt
替换为Move_Job.txt
我在 VBA EXCEL 中使用以下代码
str = "C://Documents/TestUser/WWW/Help/Files/Move_Help.txt"
rlpStr = Replace(str, 'Help', 'Job')
我来了
"C://Documents/TestUser/WWW/Job/Files/Move_Job.txt"
预期
"C://Documents/TestUser/WWW/Help/Files/Move_Job.txt"
你能帮忙吗?
仅供参考:我无法将 Move_Help 与 Move_Job 匹配(Move_ 不是常量。它可以是任何字符串)
【问题讨论】:
下划线是否一致?如果是这样,您可以使用rlpStr = Replace(str, "_Help", "_Job")
。
不是。它可以是任何字符。
【参考方案1】:
Str = "C://Documents/TestUser/WWW/Help/Files/Move_Help.txt"
ValueCrnt = "帮助" ValueNew = "工作"
Pos = InStrRev(Str, ValueCrnt)
如果位置 > 0 那么 Str = Mid(Str, 1, Pos - 1) & Replace(Str, ValueCrnt, ValueNew, Pos) 结束如果
Wscript.Echo Str
【讨论】:
不要发布仅代码的答案,请添加一些关于代码含义的解释。【参考方案2】:有一个解决方案:
rlpStr = StrReverse(Replace(StrReverse(str), StrReverse("Help"), StrReverse("Job"), , 1))
从技术上讲,它比组合 InStr
和 Replace
效率略低,但如果需要,它可以在另一个表达式中使用。另外,我喜欢单线解决方案,只要它们不是难以理解的。
【讨论】:
【参考方案3】:下面代码中的技术能满足你的要求吗?
Str的初始值为:
C://Documents/TestUser/WWW/Help/Files/Move_Help.txt
最终值为:
C://Documents/TestUser/WWW/Help/Files/Move_Job.txt
代码使用InStrRev
定位最后一次出现的ValueCrnt
(如果有),如果存在ValueCrnt
,它将用ValueNew
替换最后一次出现。
Option Explicit
Sub Demo()
Dim Pos As Long
Dim Str As String
Dim ValueCrnt As String
Dim ValueNew As String
Str = "C://Documents/TestUser/WWW/Help/Files/Move_Help.txt"
ValueCrnt = "Help"
ValueNew = "Job"
Pos = InStrRev(Str, ValueCrnt)
If Pos > 0 Then
Str = Mid(Str, 1, Pos - 1) & Replace(Str, ValueCrnt, ValueNew, Pos)
End If
Debug.Print Str
End Sub
【讨论】:
以上是关于仅替换 VBA 中字符串中最后一次匹配的匹配项的主要内容,如果未能解决你的问题,请参考以下文章