仅替换 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))

从技术上讲,它比组合 InStrReplace 效率略低,但如果需要,它可以在另一个表达式中使用。另外,我喜欢单线解决方案,只要它们不是难以理解的。

【讨论】:

【参考方案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 中字符串中最后一次匹配的匹配项的主要内容,如果未能解决你的问题,请参考以下文章

从正则表达式仅返回部分匹配项

从正则表达式仅返回部分匹配项

仅匹配指定字符的最后一次出现的正则表达式

python 在字符串中查找匹配项并将其替换为替换字符串,直到没有匹配字符串。

替换文件中的第 N 个字符串匹配项

PHP Regex preg_replace 函数仅查找和替换 3 个匹配项中的第一个和最后一个,而不是中间一个