gpt4 book ai didi

.net - 解析 .NET 中的 VB6 代码

转载 作者:行者123 更新时间:2023-12-04 20:22:05 24 4
gpt4 key购买 nike

我有一个用 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脚本中找到这样的代码,并提取我需要的数据吗?该代码位于子例程中,因此我无法传入“废话”、“某个值”并返回“其他废话”、“列表名称”。我无法控制这个 VB6 脚本的内容。

最佳答案

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

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

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

关于.net - 解析 .NET 中的 VB6 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5382088/

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