Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在.NET中解析VB6代码_.net_Regex_Parsing_Vb6 - Fatal编程技术网

在.NET中解析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'时,字

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

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;