在.NET中解析VB6代码
我有一个用C#编写的WPF项目,为了获得一些关于外部依赖的信息,我需要解析VB6脚本。脚本的位置发生了变化,其内容也发生了一些变化,但我感兴趣的主要代码的格式如下:在.NET中解析VB6代码,.net,regex,parsing,vb6,.net,Regex,Parsing,Vb6,我有一个用C#编写的WPF项目,为了获得一些关于外部依赖的信息,我需要解析VB6脚本。脚本的位置发生了变化,其内容也发生了一些变化,但我感兴趣的主要代码的格式如下: Select Case Fields("blah").Value Case "Some value" Fields("other blah").List = Lists("a list name") ... End Select 我需要从中提取,当字段'blah'设置为'some value'时,字
Select Case Fields("blah").Value
Case "Some value"
Fields("other blah").List = Lists("a list name")
...
End Select
我需要从中提取,当字段'blah'设置为'some value'时,字段'other blah'的列表将更改为列表'a list name'。我试着在谷歌上搜索一个作为.NET库编写的VB6解析器,但还没有找到任何东西。冒着这样的风险,我是否应该使用正则表达式在VB6脚本中找到类似这样的代码,并提取所需的数据?代码是在一个子例程中找到的,这样我就不能传入'blah','some value',然后返回'other blah','a list name'。我无法控制此VB6脚本的内容。您可以通过几个步骤对其进行解析。请注意,正则表达式忽略了字符串和注释,因此请小心使用 首先,我们将为
字段(“Target”).List=List(“Value”)
行使用一个helper类:
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+)*
";
这里有一个有效的例子:谢谢!这些正则表达式非常好,比我提出的更全面。我必须从添加一个Zip扩展方法,因为我使用的是.NET3.5(对不起,我没有指定)。我需要改变我的匹配,可能需要一个新的正则表达式来处理
Case Else
,因为它也出现了(我在最初的问题中没有提到)。@Sarah-没问题,很乐意帮助:)
另请参见。例如,有一个,还有一个第三方的商业广告。
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;