正则表达式中的可选替换

时间:2015-08-28 20:41:26

标签: regex vba

我正在使用RegEx的JS风格在VBA中创建一个正则表达式。这是我遇到的问题:

目前的RegEx:

(^6)(?:a|ab)?

我有一个6后跟任何一个,'a'或'ab'。

如果是6后面没有任何东西,我想用$ 1返回6 如果是6后跟'a'或'ab'我想返回6B

所以我需要'B'是可选的,取决于是否存在'a'或'ab'。

效果如下:$ 1B?

那当然不起作用。如果'a'或'ab'存在,我只想要B,否则只需要1美元。

这可以用单个正则表达式模式吗?我可以只有2个独立的模式,一个只寻找6个,另一个寻找6'a'or'ab'...但我的实际正则表达式模式要复杂得多,我可能需要几种模式来覆盖其中的一些。 ..

感谢您的光临。

2 个答案:

答案 0 :(得分:0)

我认为你的问题没有明确定义 - 例如,我不知道你为什么需要替换 - 但从我可以推断的情况来看,以下内容可能对你有用:

target = "6ab"
result = ""

With New RegExp
    .Pattern = "^(6)(?:a(b?))?"

    Set matches = .Execute(target)

    If Not matches Is Nothing Then
        Set mat = matches(0)

        result = mat.SubMatches(0)

        If mat.SubMatches.Count > 1 Then
            result = result & UCase(mat.SubMatches(1))
        End If
    End If

    Debug.Print result
End With

您基本上检查捕获组以确定b捕获是否有命中。虽然您使用了a|ab,但我认为和可选的b(b?)更为重要。它可能比任何东西都更具风格。

答案 1 :(得分:0)

正如我在评论中提到的,没有办法告诉正则表达式引擎在替换字符串中选择文字替代。因此,您所能做的就是访问Submatches以检查您到达的值,并返回适当的值。

请注意,您拥有的正则表达式应该包含2个捕获组,或者至少是您不知道确切文本的捕获组((ab?))。

以下是我在代码中的想法:

Function RxCondReplace(ByVal str As String) As String
RxCondReplace = ""
Set objRegExp = CreateObject("VBScript.RegExp")
objRegExp.Pattern = "^6(ab?)?"          
Set objMatches = objRegExp.Execute(str)
Set objMatch = objMatches.Item(0)           ' Only 1 match as .Global=False
 If objMatch.SubMatches.Item(0) = "a" Or _ ' check if 1st group equals "a"
   objMatch.SubMatches.Item(0) = "ab" Then ' check if 1st group equals "ab"
   RxCondReplace = "6B"
 ElseIf objMatch.SubMatches.Item(1) = "" Then ' check if 2nd group is empty
   RxCondReplace = "6"
 End If
End Function

' Calling the function above
Sub CallConditionalReplace()
Debug.Print RxCondReplace("6")   ' => 6
Debug.Print RxCondReplace("6a")  ' => 6B
Debug.Print RxCondReplace("6ab") ' => 6B
End Sub