2011-03-21 14 views
5

C# ile yazılmış bir WPF projem var ve bir dış bağımlılık hakkında bilgi almak için bir VB6 komut dosyasını ayrıştırmam gerekiyor. komut dosyasının konumu değişir ve içeriği bazı değiştirir, ancak benim ilgilendiğim ana kod formatının olacaktır:.NET'te VB6 kodunu ayrıştırma

Ben bundan ayıklamak olduğunu gerekir
Select Case Fields("blah").Value 
    Case "Some value" 
     Fields("other blah").List = Lists("a list name") 
    ... 
End Select 

alanın 'selam' 'bazı değere ayarlandığında ',' diğer blah 'alanı için liste' liste adı 'listelenir. .NET kitaplığı olarak yazılmış bir VB6 çözümleyici için Googling'i denedim ancak henüz bir şey bulamadım. this one gibi bir yanıt alma riski altında, VB6 komut dosyasında bu kodu bulmak için normal ifadeleri kullanmalı ve ihtiyacım olan verileri ayıklamam gerekir mi? Kod bir altprogramda, 'blah', 'bir değerde' geçemediğim ve 'diğer blah', 'bir liste ismi' alacağım şekilde bulunur. Bu VB6 komut dosyasının içeriği üzerinde hiçbir kontrolüm yok.

+0

Ayrıca bkz [Bu soru] (http://stackoverflow.com/questions/1129149/visual-basic-6-0-language-syntax) . Örneğin, [VBScript için bir dilbilgisi] vardır (http://stackoverflow.com/questions/1129149/visual-basic-6-0-language-syntax/1129425#1129425) ve üçüncü taraf bir ticari [VB6 ayrıştırıcı] (http://stackoverflow.com/questions/1129149/visual-basic-6-0-language-syntax/1129163#1129163). – MarkJ

cevap

4

Birkaç adımda ayrıştırabilirsiniz. Normal ifadelerin dizeleri ve yorumları kaçırdığını lütfen unutmayın, bu nedenle dikkatli kullanın.

Öncelikle, Fields("Target").List = Lists("Value") hatları için bir yardımcı sınıf kullanacağız:

class ListData 
{ 
    public string Target { get; set; } 
    public string Value { get; set; } 
} 

desenleri Out:

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+)* 
"; 

İleri, biz kodu (iki geçişte metin ayrıştırmak için deneyebilirsiniz biraz çirkin, bu arada, ama oldukça basit):

Artık tüm verilerle bir sözlüğünüz var . Örneğin:

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

çalışan bir örnek: https://gist.github.com/880148

+0

Teşekkürler! Bu düzenli ifadeler harika, ve daha önce ortaya koyduğumdan daha iyi. .NET 3.5 kullanıyorum çünkü http://weblogs.thinktecture.com/cnagel/2010/02/linq-with-net-4-zip.html bir Zip uzantısı yöntemi eklemek zorunda kaldım (Ben belirtmedim bu, üzgünüm). Eşleştirmeyi değiştirmem gerekecek ve muhtemelen Case Else ile başa çıkmak için yeni bir regex kullanmam gerekecek, çünkü bu da ortaya çıkıyor (orijinal soruda bundan bahsetmemiştim). –

+0

@Sarah - Sorun değil, yardım etmekten mutluluk duyuyorum:) – Kobi