繁体   English   中英

查找分隔符 VBA 之间的整个字符串片段的替换

[英]Find replace on the entire string fragments between delimiters VBA

我有管道分隔的字符串,我需要在管道之间的entire substring 上查找和替换

所以如果我的字符串看起来像

AAAP|AAA TTT|AAA|000AAA|AAAP|AAA TTT|AAA|000AAA|AAAP|AAA TTT|AAA|AAA

AAA可以在字符串中的任何位置。 开始和/或结束或多次存在

我想用ZZZ代替AAA

我需要的结果:

AAAP|AAA TTT|ZZZ|000ZZZ|AAAP|AAA TTT|ZZZ|000ZZZ|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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM