迭代匹配并替换VBA RegEx

时间:2012-12-22 04:25:35

标签: regex excel excel-vba vba

是否可以迭代VBA RegEx匹配并替换为ID值给出的特定数据?

如,

<a id="a-UP:124" {REPLACEITEMHERE}
.../a>

我的模式是这样的:

<a id="a-([\w\d]+:[\w\d]+)" ({REPLACEITEMHERE})

所以我有多个“替换项目”,每个“替换项目”都是UP:124的唯一值。

这可能在VBA RegEx吗?在我经历一个更繁琐的过程之前,我只是想知道!谢谢!

UPDATE(根据评论者的要求提供更多详细信息 - 希望这能让我更清楚我正在寻找的内容!我了解如何创建模式,它更多地迭代结果,然后执行替换每个人都发现我遇到了麻烦。谢谢!):

这是我正在使用的RegEx模式:

<a id="a-([\w\d]+:[\w\d]+)"[^{]+({FILE})[^{]+({PERCENT})[^{]+({COLOR})

设置为:

.Global = True
.IgnoreCase = True
.MultiLine = False

我想要的替换模式是检查第一个捕获组$1的值是什么,然后替换值{FILE} {PERCENT} {COLOR}(组{{ 1}},$2$3)以及我存储在类中的相应值。

$4

1 个答案:

答案 0 :(得分:3)

我认为你可以做一些像这个简化的例子(假设您输入的字符串很难设置为测试)

  • Global转为False,为每次替换使用一个Regexp(另一种方法是使用Global = True,然后针对不同的第一个Regexps运行匹配)
  • 使用Do循环来测试有效的Regexp是否仍然存在
  • 测试第一个submatch,然后使用Select Case运行不同的例程来替换submatches $2-$4(我存储在一个简单的数组中)

<强>码

Sub TestSub()
    Dim strIn As String
    Dim objRegex As Object
    Dim objRegMC As Object
    Dim objRegM As Object
    Dim vArray(1 To 3, 1 To 2)
    vArray(1, 1) = "No 1a"
    vArray(2, 1) = "No 2a"
    vArray(3, 1) = "No 3a"
    vArray(1, 2) = "number 1b"
    vArray(2, 2) = "number 2b"
    vArray(3, 2) = "number 3b"

    Set objRegex = CreateObject("vbscript.regexp")
    strIn = "a12stuff notme b34other missthis"
    With objRegex
        .Pattern = "([a-z]{1})(\d)(\d)([a-z]+)"
        .Global = False
        .IgnoreCase = True
        .MultiLine = False
        Do While .test(strIn)
            Set objRegMC = .Execute(strIn)
            For Each objRegM In objRegMC
                Select Case objRegM.submatches(0)
                Case "a"
                    strIn = .Replace(strIn, "$1" & vArray(1, 1) & vArray(2, 1) & vArray(3, 1))
                Case "b"
                    strIn = .Replace(strIn, "$1" & vArray(1, 2) & vArray(2, 2) & vArray(3, 2))
                End Select
            Next
        Loop
    End With
    MsgBox strIn
End Sub