gpt4 book ai didi

regex - 具有命名组的 VBA 和正则表达式

转载 作者:行者123 更新时间:2023-12-02 16:05:38 25 4
gpt4 key购买 nike

将 Java 中的方法转换为 VBA 比预期困难得多。

我有一个正则表达式,可以找到 here

它使用命名对象组,经过一些研究,VBA 似乎不支持这些命名对象组。我正在尝试为 Excel 编写一个函数,它将根据函数的输入将 IP 地址格式化为不同的格式。

如何使用命名组来捕获不同的模式?

Function formatIP(item As String, displayType As String) As String
'displayTypes CIDR,MASK,RANGE

'Set theRegEx = CreateObject("VBScript.RegExp")

Dim theRegEx As New RegExp


With theRegEx
.Global = True
.MultiLine = False
.IgnoreCase = False
.Pattern = "(?<address>\d{1,3}(?:\.\d{1,3}){2}\.(?<FromSeg>\d{1,3}))(?:(?:\/|\s+\/\s+)(?<CIDR>\d{1,2})|(?:-|\s+to\s+)(?<ToSeg>\d{1,3}(?![\d\.]))|(?:-|\s*to\s+)(?<ToIP>\d{1,3}(?:\.\d{1,3}){3})|\s+(?<Mask>25\d(?:\.\d{1,3}){3})|\s*)?"
.Execute (item)


End With


'Set MyMatches = theRegEx.Execute(item)
Debug.Print "SubMatches.Count: " & MyMatches.item(0).SubMatches.Count
If MyMatches.Count <> 0 Then
With MyMatches
For myMatchCt = 0 To .Count - 1
Debug.Print "myMatchCt: " & myMatchCt
For subMtCt = 0 To .item(subMtCt).SubMatches.Count - 1
Debug.Print "subMtCt: " & subMtCt
Debug.Print ("," & .item(myMatchCt).SubMatches.item(subMtCt))
Next
Next
End With
Else
Debug.Print "No Matches"
End If

formatIP = ""
End Function

最佳答案

你不知道。 VBA 使用 VBScript 风格的正则表达式,它不支持命名组。请改用编号捕获组。

因为这使得你的正则表达式模式更难调试...并且因为你要求解决方法,如果你有权访问 Visual Studio,你可以创建一个公开 .net 的小型 COM 可见类库-风格的正则表达式(与 Java 相比,与 VBScript 更相似)API,您可以在 VBA 代码中引用和使用。

缺点是您现在需要管理该库的部署。

如果您必须坚持使用 VBScript-regex,那么请使用类似 Expresso 的工具。 (无隶属关系,30 天后需要注册即可免费)来帮助您。

Expresso regex analyzer

虽然 Expresso 理解 .net 正则表达式,所以它会认为你的模式完全有效。

或者,使用Rubberduck正则表达式助手功能,它理解 VBScript-regex 并会告诉您模式的哪些部分在 VBA 中不起作用(免责声明:我维护该项目 - 它是免费的、开源的并且积极维护):

Rubberduck regex analyzer

enter image description here

祝你好运!

关于regex - 具有命名组的 VBA 和正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42961146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com