몇 단계로 구문 분석 할 수 있습니다. 정규 표현식은 문자열과 주석을 누락하므로주의해서 사용해야합니다.
첫째, 우리는 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
도 참조 [이 질문] (http://stackoverflow.com/questions/1129149/visual-basic-6-0-language-syntax) . 예를 들어 [VBScript 용 문법] (http://stackoverflow.com/questions/1129149/visual-basic-6-0-language-syntax/1129425#1129425)과 타사 상용 [VB6 파서] (http://stackoverflow.com/questions/1129149/visual-basic-6-0-language-syntax/1129163#1129163). – MarkJ