2016-04-05 12 views
0

Farklı dillerdeki formda, kapsüllenmiş verilerle doldurulan doğal dilde bir metin dosyası var. Örneğin:Bir dizenin kapsüllenmiş bölümlerini ayırma/tanımlama C# (alt dizeleri belirleme)

<Age>53 year old</Age> woman, well known since earlier. Currently under the care of 
<First_Name>Sara</First_Name> <Last_Name>Storm</Last_Name> 
and dr. <First_Name>John</First_Name> <Last_Name>Beck</Last_Name> 

Ne tüm etiketleri ve bunların veri ayıklamak için en iyi yolu olurdu? Ben dize dolaşır bir etiket endeksi bulmak için bir döngü kullanarak denedi

<Age>53 year old</Age> 
<First_Name>Sara</First_Name> 
<First_Name>John</First_Name> 
<Last_Name>Storm</Last_Name> 
<Last_Name>Beck</Last_Name> 

istediğim çıkıştır. Listelere farklı etiketler ve kapsüllenmiş verileri eklemek istediğimden bu çözüm uygun değil:

string findFirstName = "<First_Name>"; 
string findLastName = "<Last_Name>"; 
string endFirstName = "</First_Name>"; 
string endLastName = "</Last_Name>"; 
string findAge = "<Age>"; 
string endAge = "</Age>"; 

int startIndex; 
int endIndex; 
int length; 
foreach (Match m in Regex.Matches(pieceContent, findFirstName)) 
{  
    startIndex = m.Index; 
} 

Teşekkür ederiz!

+0

Bunun için neden bir XML ayrıştırıcısı kullanmıyorsunuz? –

+0

@ SelmanGenç - Bu XML değil. – Quintium

cevap

1

Etiket yakalamak için Regex geribaşvuru kullanabilirsiniz:

var tags = Regex.Matches(input, @"<([_a-zA-Z]+)>.*<\/\1>"); 

ilk yakalama grubunu ([_a-zA-Z]+) (orada bundan daha XML adlarına daha kısıtlamalar vardır, ama bu basit bir örnek etiket adını maç olacak sadece harfler ve alt çizgiler sağlar) - ve geri tepkisi \1 kapanış etiketiyle ilk yakalama grubuna eşleşir.

+0

Söylemeliyim ki, bu backreference olayı son derece havalı. Daha önce hiç duymadım! – GuyMontag

İlgili konular