解析.NET中的VB6代码
发布时间:2020-12-17 00:02:38 所属栏目:大数据 来源:网络整理
导读:我有一个用C#编写的WPF项目,为了获得有关外部依赖项的一些信息,我需要解析一个VB6脚本.脚本的位置发生了变化,其内容发生了变化,但我感兴趣的主要代码的格式如下: Select Case Fields("blah").Value Case "Some value" Fields("other blah").List = Lists("a
我有一个用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’,’some value’并返回’other blah’,’list name’.我无法控制这个VB6脚本的内容.
您可以通过几个步骤解析它.请注意正则表达式错过了字符串和注释,因此请小心使用.
首先,我们将使用Fields的一个辅助类(“Target”).List = Lists(“Value”)行: class ListData { public string Target { get; set; } public string Value { get; set; } } 出模式: string patternSelectCase = @" Selects+Cases+Fields(""(?<CaseField>[ws]+)"").Value (?<Cases>.*?) Ends+Select "; string patternCase = @" Cases+""(?<Case>[ws]+)""s+ (?:Fields(""(?<Target>[ws]+)"").Lists*=s*Lists(""(?<Value>[ws]+)"")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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |