[英]Find replace on the entire string fragments between delimiters VBA
我有管道分隔的字符串,我需要在管道之間的entire
substring 上查找和替換
所以如果我的字符串看起來像
AAAP|AAA TTT|AAA|000
或AAA|AAAP|AAA TTT|AAA|000
或AAA|AAAP|AAA TTT|AAA|AAA
AAA
可以在字符串中的任何位置。 開始和/或結束或多次存在
我想用ZZZ
代替AAA
我需要的結果:
AAAP|AAA TTT|ZZZ|000
或ZZZ|AAAP|AAA TTT|ZZZ|000
或ZZZ|AAAP|AAA TTT|ZZZ|ZZZ
我得到的結果
AAAP|ZZZ TTT|ZZZ|000
...
如何限制更換為整個substring
Sub ExtractSubstringReplace()
Dim strSource, strReplace, strFind, RegExpReplaceWord, r, a
strSource = "AAAP|AAA TTT|AAA|000"
strFind = "AAA"
strReplace = "ZZZ"
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
re.Global = True
re.IgnoreCase = True
re.Pattern = "\b" & strFind & "\b"
RegExpReplaceWord = re.Replace(strSource, strReplace)
MsgBox RegExpReplaceWord
End Sub
您可以使用
re.Pattern = "(^|\|)" & strFind & "(?![^|])"
RegExpReplaceWord = re.Replace(strSource, "$1" & strReplace)
請參閱(^|\|)AAA(?![^|])
正則表達式演示。 請注意,它等於(^|\|)AAA(?=\||$)
。
詳情:
(^|\|)
- 捕獲組 1:字符串開頭或 pipe 字符AAA
- 搜索字符串(?![^|])
/ (?=\||$)
- 確保有|
或字符串的結尾緊挨當前位置的右側。 注意:如果您的strFind
可以包含特殊的正則表達式元字符,請確保使用正則表達式和嵌入的特殊字符的解決方案轉義字符串。
將要進行替換的字符串 (AAAP|AAA TTT|AAA|000) 放在 Sheet1 的單元格 A1 中,然后運行以下代碼。 您將獲得在單元格 A2 中進行替換的整個字符串。
Sub ExtractSubstringReplace()
Dim strArr, str, strArrNew(), strSource As String, strReplace As String, strFind As String, i As Long
strSource = Sheet1.Range("A1").Value
strFind = "AAA"
strReplace = "ZZZ"
strArr = Split(Sheet1.Range("A1").Value, "|")
For Each str In strArr
If str = strFind Then str = strReplace
ReDim Preserve strArrNew(i)
strArrNew(i) = str
i = i + 1
Next str
For Each str In strArrNew
Debug.Print str
Next str
Sheet1.Range("A2").Value = Join(strArrNew, "|")
End Sub
我會 go 使用@Siddharth Rout 評論中提供的選項,因為它可能是最有效的。
Sub Test()
MsgBox ExtractSubstringReplace("AAAP|AAA TTT|AAA|000", "AAA", "ZZZ")
MsgBox ExtractSubstringReplace("AAA|AAAP|AAA TTT|AAA|000", "AAA", "ZZZ")
MsgBox ExtractSubstringReplace("AAA|AAAP|AAA TTT|AAA|AAA", "AAA", "ZZZ")
End Sub
Public Function ExtractSubstringReplace(ByVal strSource As String _
, ByVal strFind As String _
, ByVal strReplace As String _
, Optional ByVal delimiter As String = "|" _
) As String
Dim result As String
'Duplicate delimiter and also add leading and trailing delimiter
result = delimiter & Replace(strSource, delimiter, delimiter & delimiter) & delimiter
'Replace substrings
result = Replace(result, delimiter & strFind & delimiter, delimiter & strReplace & delimiter)
'Remove leading and trailing delimiter that we added previously
result = Mid$(result, Len(delimiter) + 1, Len(result) - Len(delimiter) * 2)
'Restore delimiters
ExtractSubstringReplace = Replace(result, delimiter & delimiter, delimiter)
End Function
您還可以在 Excel 單元中使用 function。
稍微縮短的代碼
除了@ChristianBuse 的優秀解決方案之外,另一種基於相同想法的快速方法(只需要 0.00 到最大 0.02 秒) :
Function SubRep(src, fnd, repl, Optional ByVal delim As String = "|") As String
SubRep = delim & src & delim
Dim i As Long
For i = 1 To 2
SubRep = Replace(SubRep, delim & fnd & delim, delim & repl & delim)
Next
SubRep = Mid$(SubRep, 2, Len(SubRep) - 2)
End Function
示例調用
Sub ExampleCall()
Dim terms
terms = Array("AAAP|AAA TTT|AAA|000", "AAA|AAAP|AAA TTT|AAA|000", "AAA|AAAP|AAA TTT|AAA|AAA")
Dim i As Long
For i = LBound(terms) To UBound(terms)
Debug.Print Format(i, "0 ") & terms(i) & vbNewLine & " " & _
SubRep(terms(i), "AAA", "ZZZ")
Next
End Sub
結果在 VB 編輯器的即時 window
0 AAAP|AAA TTT|AAA|000
AAAP|AAA TTT|ZZZ|000
1 AAA|AAAP|AAA TTT|AAA|000
ZZZ|AAAP|AAA TTT|ZZZ|000
2 AAA|AAAP|AAA TTT|AAA|AAA
ZZZ|AAAP|AAA TTT|ZZZ|ZZZ
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.