在.NET 中解析 VB6 代码

2023-12-15

我有一个用 C# 编写的 WPF 项目,为了获取有关外部依赖项的一些信息,我需要解析 VB6 脚本。脚本的位置发生了变化,其内容也发生了一些变化,但我感兴趣的主要代码将采用以下格式:

Select Case Fields("blah").Value
    Case "Some value"
        Fields("other blah").List = Lists("a list name")
    ...
End Select

我需要从中提取,当字段“blah”设置为“某个值”时,字段“other blah”的列表更改为列表“列表名称”。我尝试在谷歌上搜索一个作为 .NET 库编写的 VB6 解析器,但还没有找到任何东西。冒着得到类似答案的风险this one,我是否应该只使用正则表达式在VB6脚本中找到这样的代码,并提取我需要的数据?该代码是在子例程中找到的,因此我无法传递“blah”、“某个值”并返回“other blah”、“列表名称”。我无法控制这个 VB6 脚本的内容。


您可以通过几个步骤来解析它。请注意,正则表达式会丢失字符串和注释,因此请小心使用。

首先,我们将使用一个辅助类Fields("Target").List = Lists("Value") lines:

class ListData
{
    public string Target { get; set; }
    public string Value { get; set; }
}

输出模式:

string patternSelectCase = @"
Select\s+Case\s+Fields\(""(?<CaseField>[\w\s]+)""\)\.Value
(?<Cases>.*?)
End\s+Select
";

string patternCase = @"
Case\s+""(?<Case>[\w\s]+)""\s+
(?:Fields\(""(?<Target>[\w\s]+)""\)\.List\s*=\s*Lists\(""(?<Value>[\w\s]+)""\)\s+)*
";

接下来,我们可以尝试分两次解析文本(顺便说一句,代码有点难看,但相当基本):

MatchCollection matches = Regex.Matches(vb, patternSelectCase,
        RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | 
        RegexOptions.Singleline);

Console.WriteLine(matches.Count);

var data = new Dictionary<String, Dictionary<String, List<ListData>>>();
foreach (Match match in matches)
{
    var caseData = new Dictionary<String, List<ListData>>();
    string caseField = match.Groups["CaseField"].Value;
    string cases = match.Groups["Cases"].Value;

    MatchCollection casesMatches = Regex.Matches(cases, patternCase,
             RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace | 
             RegexOptions.Singleline);
    foreach (Match caseMatch in casesMatches)
    {
        string caseTitle = caseMatch.Groups["Case"].Value;
        var targetCaptures = caseMatch.Groups["Target"].Captures.Cast<Capture>();
        var valueCaptures = caseMatch.Groups["Value"].Captures.Cast<Capture>();
        caseData.Add(caseTitle, targetCaptures.Zip(valueCaptures, (t, v) =>
            new ListData
            {
                Target = t.Value,
                Value = v.Value
            }).ToList());
    }

    data.Add(caseField, caseData);
}

现在你有了一本包含所有数据的字典。例如:

string s = data["foo"]["Some value2"].First().Value;

这是一个工作示例:https://gist.github.com/880148

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在.NET 中解析 VB6 代码 的相关文章

  • 根据另一个列表的内容对列表进行排序

    我有一个包含整数列表的列表和另一个包含同时包含整数和字符串的类的列表 我想做的是按字母顺序对列表进行排序 将第一个列表中存在的条目放在前面 这是我的代码和预期输出 using System using System Collections
  • 当应用程序未聚焦时监听按键

    我有一个应用程序 C 4 0 WPF 它是隐藏的 可以通过单击系统托盘图标或我创建的其他框架 停靠在左侧和最上面的小框架 来显示 My customer wants to add a new way to display the appli
  • 那里有更好的 DateTime.Parse 吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道有一个库 付费或免费 能够处理比 DateTime Parse 使用的更常见的日期时间格式 能够
  • Facebook Graph API“/userid/feed”返回空白

    我正在使用 Facebook C SDK 但似乎无法使用 Graph API 获取反馈数据 我已从用户那里获得了以下扩展权限 范围 离线访问 publish stream publish checkins create event read
  • std::regex 转义正则表达式中使用的特殊字符

    我是字符串来创建一个std regex FILE 作为单元测试的一部分 检查一些打印文件名的异常输出 在 Windows 上失败并显示 regex error error escape 表达式包含无效的转义字符或尾随转义 因为 FILE 宏
  • 可选参数代码在 .NET 3.5 中编译。为什么?

    这段代码在 VS 2010 的框架 3 5 项目中编译正常 我三次检查过 public LoggingClient string uri net msmq localhost logging 为什么 我在 C 4 规范中没有看到任何内容 文
  • 如何在批处理文件中解析带有特殊分隔符的文件?

    我想使用批处理来解析一个如下所示的文件 a string containing various characters and spaces 1 b string containing various characters and space
  • ruby 正则表达式扫描与 =~

    Ruby 1 9 3 文档似乎暗示 scan 等同于 除了 scan 返回多个匹配项 而 仅返回第一个匹配项 并且 scan 返回匹配数据 而 返回索引 但是 在下面的示例中 这两种方法似乎对相同的字符串和表达式返回不同的结果 这是为什么
  • 在 ControlTemplate.Triggers 中使用 TemplateBinding

    为什么下面的 XAML 会给我一个 XamlParseException 并显示 无意义的 消息 表达式类型不是有效的样式值 在运行时
  • 强制发送带有请求的根 CA

    我们有第三方 API 提供商提供 SOAP API 他们提供了3个证书 客户证书 中级证书 根证书 所有证书均在本地安装 他们提供了带有密码的 pfx 证书 我们已经在 SOAP UI 工具中上传了这个 pfx 并运行了一个请求 它起作用了
  • 为什么 NASM 在使用有效的指令助记符作为操作数中的符号名称方面没有问题?

    我编写了以下简单程序 但 nasm 拒绝编译它 section text global start start mov rax 0x01 mov rdi 0x01 mov rsi str mov rdx 0x03 syscall mov r
  • Spring.Net可以起到PostSharp的作用吗?

    几个月前 我发现了 PostSharp 有一段时间 它非常棒 但随后法律部门回复说他们不喜欢旧版本的许可证 然后部门告诉我2 0的价格高得令人无法接受 对于我们需要的座位数量 我非常失望 但并不沮丧 我想 这不可能是唯一的这样的框架 我一直
  • 如何突出显示 html 文档中文本查询的搜索结果而忽略 html 标签?

    我有一个字符串 其中包含 html 内容 像这样的东西 const text My name is Alan and I span an span div class someClass artist div 我使用以下命令在反应组件中渲染
  • 如何让“dnu”命令在 OS X 上运行?

    刚刚下载并安装视觉工作室代码 https code visualstudio com 在 OS X 10 10 3 上 我已经设法部分遵循ASP NET 5 安装说明 https code visualstudio com docs ASP
  • 如何使用Entity Framework Code First CTP 5存储图像?

    我只是想弄清楚是否有一种简单的方法可以使用 EF Code First CTP 5 存储和检索二进制 文件 数据 我真的很希望它使用 FILESTREAM 类型 但我真的只是在寻找某种方法让它工作 我总是创建另一个类 例如ProductIm
  • 在 C# 中解析 JS Date.toIsoString

    我需要将 JS 日期存储为 ISO 8601 日期 我目前正在从格式为 2019 06 22T00 00 00 000Z 的表单中获取日期 正如 JS 的 toIsoString 方法所期望的那样 当这个日期传递到我的 API 控制器时 我
  • C# 可以为控制台应用程序部分类“程序”类吗?

    我想知道是否可以将为任何控制台应用程序创建的默认 程序 类更改为部分类 我想这样做是因为我想要更好的组织 而不是将所有方法都放在按区域分类的 1 个文件中 对我来说 将某些方法类别放在单独的文件中会更有意义 我对分部类的理解是 它是多个文件
  • 查找数组中的多个索引

    假设我有一个像这样的数组 string fruits watermelon apple apple kiwi pear banana 是否有一个内置函数可以让我查询 apple 的所有索引 例如 fruits FindAllIndex ap
  • 如何防止 Lotus Notes 用户转发或复制通过 System.Net.Mail 发送的邮件?

    我想使用 SMTP 客户端 uiing microsft net 以 C 作为编程语言发送电子邮件 但是对于通过SMTP客户端发送的电子邮件 我们是否可以添加 禁止转发 或 禁止复制 等安全功能 我不希望电子邮件的收件人转发或复制电子邮件的
  • 批准后使用 jenkinsfile 构建促销

    仅当更改管理使用 servicenow 更改票证或通过手动批准批准它时 我才需要使用 jenkins 文件将我的构建升级到生产 我想要类似的东西 产品构建只有在经理批准后才能手动触发 他 她应该收到带有批准 拒绝链接的批准邮件 或者 如果与

随机推荐

  • 在 Heroku 上结合使用 Resque、Puma 和 Scheduler

    在查看了大量指南后 我想确认我的设置 现在我的procfile好像 web bundle exec puma C config puma rb config ru resque TERM CHILD 1 RESQUE TERM TIMEOU
  • 如何恢复用 jQuery 删除的元素?

    如果使用删除元素 notification remove 我们如何将其创建回来 你无法得到那个特定的例子后退 使用 remove 将其从 DOM 中删除 不过 您可以创建它的克隆 在 DOM 中移动它 隐藏它等等 根据您的项目需求 您可能还
  • 读取行时,awk $line

    我有一个包含数字列表的文件 我有第二个文件 每个文件包含各种条目和多个字段 我想要做的是获取第 12 个字段等于第一个数字的所有行 并将它们放入一个新文件中 然后放入第二个数字 依此类推 我写了一句很有道理的俏皮话 但我不明白为什么它行不通
  • Spring 4 静态内容(如 css/js)带来错误 405 不支持请求方法“GET”

    我已经检查过这个问题 但是经过 4 个小时的尝试 没有任何结果对我有用 尝试访问我的 css 文件时收到 405 错误 这是我的 Config java package com myapp config import org springf
  • 如何确保我的 makefile 检测到头文件和 cpp 文件中的更改?

    目前 每当我这样做时make我的 makefile 告诉我 make some obj file o 是最新的 无论我是否编辑了生成该目标文件所涉及的任何文件 我如何让它检测变化 这是一个重现该问题的简单 makefile SHELL bi
  • C# 中的二维数组切片

    我正在寻找在 C 中切片二维数组 我有 double 2 2 价格 想要检索该数组的第二行 我尝试过价格 1 但我有一种感觉 可能是别的东西 提前致谢 没有直接的 切片 操作 但您可以定义如下扩展方法 public static IEnum
  • 扫描仪扫描文档(TIFF 和 PDF)的最佳设置[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 扫描仪的最佳设置是什么 以便扫描文档 白色和黑色文本 并将其用于 OCR 转换 以获得最佳结果 以及 PDF 和 TIFF 格式的标准设置和规范是什么 对于 OCR 最佳扫描设置是
  • Symfony2:未设置记住我令牌

    我按照需要做了一切 但我的 记住我 标记尚未设置 我跟踪代码直到 vendor symfony src Symfony Component Security Http RememberMe TokenBasedRememberMeServi
  • R 中的 ezANOVA 和pairwise.t.test:输出

    我一直在使用 R 运行 ezANOVA 然后进行成对比较 pairwise t test 运行后似乎不包含输出 所以我有以下与此相关的问题 是否有可能在 ezANOVA 中生成均方误差以进行重复测量 如果可以 如何生成 以及如何在pairw
  • 如何设置DataGrid中选定行的颜色

    DataGrid 中选定行的默认背景颜色太暗 我无法读取它 有没有办法覆盖它 试过这个
  • 在文件夹 blog 的同一域中安装 Wordpress 和 Laravel

    我在同一个domain com 上安装了laravel 该网站已启动并运行 我需要在domain com blog 的博客文件夹中安装wordpress 当我尝试安装 WordPress 时 它不允许我运行安装并显示 此网页有重定向循环 我
  • 带引号的注册表值

    我需要将一个值插入批处理文件中的注册表中 该值包含引号 这使得插入变得困难 set OPENCOMMAND JAVAHOME bin javaw exe jar 1 reg add HKEY LOCAL MACHINE SOFTWARE C
  • 如何对未知属性的数据进行建模?

    对需要查询但无法预先完全定义的数据进行建模的好方法是什么 例如 假设我想对有关以下内容的信息进行建模世界各国 每个国家都有一个人口 a flag和一个列表语言 这很容易 但是假设我们还想建模他们的国家棒球队的胜 负记录当然 并非所有国家都有
  • 使用列级标题过滤 Slickgrid 时如何执行部分匹配?

    当使用固定标题行实现列级过滤器时 如何返回部分匹配的单元格 IE 搜索词 omato 退货 自动机 番茄等 在示例中的 MyFilter 下替换此循环 for var columnId in columnFilters if columnI
  • 如何使用该目录的文件描述符在内核级别打开该目录?

    我正在开发一个项目 我必须打开一个目录并在内核级别读取其中的文件 目录 我基本上想找出如何ls是在内核级别实现的 现在我已经弄清楚如何使用以下命令获取目录的文件描述符sys open 和O DIRECTORY flag 但我不知道如何读取收
  • 在运行时用 Java 创建 n 维数组

    我有一个包含数组的字符串 例子 1 2 4 5 7 8 现在 我想用它制作一个实际的 Java 数组 我创建了一个函数来获取维度 并创建了一个递归函数来获取数组的每个元素 因此 我创建了每个一维数组 但我想知道Java中是否有一种方法可以创
  • 如何从子级向父级引用一个类?

    这可能听起来很愚蠢 但我如何在父级的另一个脚本中引用子级中的一个脚本中的类 我在谷歌上找不到任何东西 注意 我的脚本中有几个错误 这不是本文的重点 Public Private private Rigidbody myRigidbody p
  • android webview 中的 onClick 事件太慢

    我感觉 javascript 本身在 android webview 中相当快 但是触摸元素和触发 onclick 事件之间有很长的延迟 我可以想象 如果您在页面之间导航 这是一个功能 您首先看到元素上的突出显示 然后看到效果 导航 但对于
  • 从 http.Request 获取客户端 IP 地址的正确方法

    获取所有客户端 IP 地址的正确方法是什么http Request In PHP有很多的变量我应该检查一下 Go 上也一样吗 我发现的一项是 req RemoteAddr 请求是否区分大小写 例如x forwarded for是相同的X F
  • 在.NET 中解析 VB6 代码

    我有一个用 C 编写的 WPF 项目 为了获取有关外部依赖项的一些信息 我需要解析 VB6 脚本 脚本的位置发生了变化 其内容也发生了一些变化 但我感兴趣的主要代码将采用以下格式 Select Case Fields blah Value