我有以下[有效]正则表达式,我试图将其放入VBA应用程序中:
(?<year>(\d{2}){0,2}[-\/]?)(?<week>(\d{2}))
我一直收到错误5017.方法&#39;执行&#39;对象&#39; IRegExp2&#39;。
不支持但如果我放弃了命名的捕获并插入:
((\d{2}){0,2}[-\/]?)((\d{2}))
我是否正确地假设&#34; vbscript&#34;正则表达式的酸味不支持命名组?
我是否可以在VBA中引用另一个标准(对Windows)库以获得更好的正则表达式解析器?
我喜欢使用C#,因为它可以立即工作并将我的小组拉出来,但由于我的整个应用插件都在MS Office中,因此我受限于VBA。
答案 0 :(得分:0)
([1-2][0-9])([0-9][0-9])[-\/](0[1-9]|[1-4][0-9]|5[0-2])
的VBA兼容正则表达式(1900-01到2999-52之间)是:
SubMatches
这将排除第53周到第99周。
要获得世纪,年,周,请使用Option Explicit
Sub TestYYYYWWRegex()
Dim objRegex As New RegExp
Dim objMatches As MatchCollection
Dim varTests As Variant
Dim varTest As Variant
Dim strMessage As String
objRegex.Pattern = "([1-2][0-9])([0-9][0-9])[-\/](0[1-9]|[1-4][0-9]|5[0-2])"
varTests = Array("2017-13", "1975-09", "2016-63", "zz78-0g", "1978-00", "1234-56", "1234-01", "YYYY-WW")
For Each varTest In varTests
Set objMatches = objRegex.Execute(CStr(varTest))
If objMatches.Count > 0 Then
With objMatches
strMessage = "Matched: " & CStr(varTest)
strMessage = strMessage & " C: " & .Item(0).SubMatches(0)
strMessage = strMessage & " Y: " & .Item(0).SubMatches(1)
strMessage = strMessage & " W: " & .Item(0).SubMatches(2)
End With
Else
strMessage = "No match for: " & CStr(varTest)
End If
'check test case
Debug.Print strMessage
Next varTest
End Sub
集合来获取不同的捕获组。
Matched: 2017-13 C: 20 Y: 17 W: 13
Matched: 1975-09 C: 19 Y: 75 W: 09
No match for: 2016-63
No match for: zz78-0g
No match for: 1978-00
No match for: 1234-56
Matched: 1234-01 C: 12 Y: 34 W: 01
No match for: YYYY-WW
测试用例:
android {}