将我在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();
}
}
}
答案 0 :(得分:4)
你没有。 VBA使用VBScript风格的正则表达式,它不支持命名组。请改用编号的捕获组。
因为这会使您的正则表达式模式更难调试...并且因为您要求解决方法,如果您有权访问Visual Studio,您可以创建一个暴露.net的COM可见类库。 -Vvored regex(更类似于Java而不是VBScript的)API,您可以在VBA代码中引用和使用它。
缺点是您现在需要管理该库的部署。
如果 坚持使用VBScript-regex,那么请使用像Expresso这样的工具(没有联盟,30天后需要注册免费)来帮助你。
Expresso理解.net正则表达式,所以它会认为你的模式完全有效。
或者,使用Rubberduck的正则表达式助手功能,该功能了解VBScript-regex并告诉您模式的哪些部分在VBA中不起作用(免责声明:我维护这个项目 - 它是免费的,开源的并且积极维护):
祝你好运!
答案 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
输出显示正确。