VBA和带有命名组的正则expression式

将我在Java中使用的方法转换为VBA将变得比预期困难得多。

我有一个正则expression式可以在这里find

它使用命名的对象组,经过一番研究,似乎不被VBA支持。 我正在尝试为excel编写一个函数,它将根据函数的input将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风格的正则expression式,它不支持命名组。 使用编号的捕获组代替。

因为这使得你的正则expression式模式更难以debugging…并且因为你问了一个解决方法,如果你有权访问Visual Studio,你可以掀起一个小的COM可见的类库,公开一个.net风味的正则expression式(更类似于Java的比VBScript的)API,你可以参考和使用你的VBA代码。

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

如果你必须坚持VBScript正则expression式,然后使用像Expresso (无隶属关系,30天后免费注册需要)的工具来帮助你。

Expresso正则表达式分析器

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

或者,使用Rubberduck的正则expression式助手function,它理解VBScript正则expression式,并会告诉你哪些部分(S)模式将不能在VBA工作(免责声明:我维护该项目 – 它是免费的,开源并积极维护) :

Rubberduck正则表达式分析器

在这里输入图像描述

祝你好运!

RegexBuddy是一个程序,可以将您的Java正则expression式转换为兼容vbScript的正则expression式。 它提供的输出与您在链接中发布的示例相同,但具有编号而不是命名捕获组:

 (\d{1,3}(?:\.\d{1,3}){2}\.(\d{1,3}))(?:(?:/|\s+/\s+)(\d{1,2})|(?:-|\s+to\s+)(\d{1,3}(?![\d.]))|(?:-|\s*to\s+)(\d{1,3}(?:\.\d{1,3}){3})|\s+(25\d(?:\.\d{1,3}){3})|\s*)? 

它将输出转换为编号组,如下所示:

 1 Address 2 FromSeg 3 CIDR 4 ToSeg 5 ToIP 

和macros中的debug.print输出看起来是正确的,使用你的链接中的例子。