我正在使用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'...但我的实际正则表达式模式要复杂得多,我可能需要几种模式来覆盖其中的一些。 ..
感谢您的光临。
答案 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