[英]Optional replacement in a Regular Expression
我正在VBA中创建一个使用RegEx的JS风格的正则表达式。 这是我遇到的问题:
目前的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'或'ab'...但是我实际的正则表达式模式要复杂得多,我可能需要几种模式来覆盖其中的一些。 ..
感谢您的光临。
我认为您的问题没有明确定义-例如,我不知道为什么需要替换-但据我推断,类似以下内容的方法可能对您有用:
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?
)更有意义。 它的风格可能比什么都重要。
正如我在评论中提到的那样,没有办法告诉正则表达式引擎在替换字符串中的文字替代项之间进行选择。 因此,您所能做的就是访问子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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.