解析.NET中的VB6代码

前端之家收集整理的这篇文章主要介绍了解析.NET中的VB6代码前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个用C#编写的WPF项目,为了获得有关外部依赖项的一些信息,我需要解析一个VB6脚本.脚本的位置发生了变化,其内容发生了变化,但我感兴趣的主要代码的格式如下:
  1. Select Case Fields("blah").Value
  2. Case "Some value"
  3. Fields("other blah").List = Lists("a list name")
  4. ...
  5. End Select

我需要从中提取出当字段’blah’设置为’某个值’时,字段’other blah’的列表会更改为列出’列表名’.我尝试使用谷歌搜索作为.NET库编写的VB6解析器,但还没有找到任何东西.有可能得到像this one这样的答案,我应该只使用正则表达式在VB6脚本中找到这样的代码,并提取我需要的数据吗?代码可以在子程序中找到,这样我就无法传递’blah’,’some value’并返回’other blah’,’list name’.我无法控制这个VB6脚本的内容.

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

首先,我们将使用Fields的一个辅助类(“Target”).List = Lists(“Value”)行:

  1. class ListData
  2. {
  3. public string Target { get; set; }
  4. public string Value { get; set; }
  5. }

出模式:

  1. string patternSelectCase = @"
  2. Select\s+Case\s+Fields\(""(?<CaseField>[\w\s]+)""\)\.Value
  3. (?<Cases>.*?)
  4. End\s+Select
  5. ";
  6.  
  7. string patternCase = @"
  8. Case\s+""(?<Case>[\w\s]+)""\s+
  9. (?:Fields\(""(?<Target>[\w\s]+)""\)\.List\s*=\s*Lists\(""(?<Value>[\w\s]+)""\)\s+)*
  10. ";

接下来,我们可以尝试在两个过程中解析文本(顺便说一下,代码有点难看,但是相当基本):

  1. MatchCollection matches = Regex.Matches(vb,patternSelectCase,RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace |
  2. RegexOptions.Singleline);
  3.  
  4. Console.WriteLine(matches.Count);
  5.  
  6. var data = new Dictionary<String,Dictionary<String,List<ListData>>>();
  7. foreach (Match match in matches)
  8. {
  9. var caseData = new Dictionary<String,List<ListData>>();
  10. string caseField = match.Groups["CaseField"].Value;
  11. string cases = match.Groups["Cases"].Value;
  12.  
  13. MatchCollection casesMatches = Regex.Matches(cases,patternCase,RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace |
  14. RegexOptions.Singleline);
  15. foreach (Match caseMatch in casesMatches)
  16. {
  17. string caseTitle = caseMatch.Groups["Case"].Value;
  18. var targetCaptures = caseMatch.Groups["Target"].Captures.Cast<Capture>();
  19. var valueCaptures = caseMatch.Groups["Value"].Captures.Cast<Capture>();
  20. caseData.Add(caseTitle,targetCaptures.Zip(valueCaptures,(t,v) =>
  21. new ListData
  22. {
  23. Target = t.Value,Value = v.Value
  24. }).ToList());
  25. }
  26.  
  27. data.Add(caseField,caseData);
  28. }

现在你有一个包含所有数据的字典.例如:

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

这是一个有效的例子:https://gist.github.com/880148

猜你在找的VB相关文章