VBA和带有命名组的正则表达式

时间:2017-03-22 19:37:50

标签: regex excel vba excel-vba

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

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

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

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace StackOverflowAnswers
{
    class Program
    {
        static void Main(string[] args)
        {

            string contents = File.ReadAllText(@"C:\temp\test.txt");
            var arrayString = contents.Split(' ');
            Console.WriteLine("Number of Words {0}", arrayString.Length);
            Console.ReadLine();
        }
    }
}

2 个答案:

答案 0 :(得分:4)

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

因为这会使您的正则表达式模式更难调试...并且因为您要求解决方法,如果您有权访问Visual Studio,您可以创建一个暴露.net的COM可见类库。 -Vvored regex(更类似于Java而不是VBScript的)API,您可以在VBA代码中引用和使用它。

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

如果 坚持使用VBScript-regex,那么请使用像Expresso这样的工具(没有联盟,30天后需要注册免费)来帮助你。

Expresso regex analyzer

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

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

Rubberduck regex analyzer

enter image description here

祝你好运!

答案 1 :(得分:1)

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

(\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
使用链接中的示例

并且宏中的debug.print输出显示正确。