2012-11-18 14 views
5

Ten kod przeszukuje richtextbox i zamienia pierwsze pole tablicy na drugie. Wszystko działa dobrze, z wyjątkiem dwóch pól.Jak uciec od znaków specjalnych w regex?

iEmo = new string[,] { 
    {@":\)", Smile}, 
    {@":\(", Sad}, 
    {@"8\)", Cool}, 
    {@":\|", Neutral}, 
    {@";\)", Wink}, 
    {@">:\(", Evil}, // Won't work for this one 
    {@">:D", Twisted}, // Or this one 
    {@":\?", Question,} 
}; 

Oto część, która przekształca tablicę do czego chcę:

public void SetSmiley(RichTextBox RichBox) { 
    for (int i = 0; i < (iEmo.Length/3); i++) { 
    try { 
     RichBox.Rtf = Regex.Replace(RichBox.Rtf, iEmo[i, 0], iEmo[i, 1], RegexOptions.IgnoreCase); 
    } 
    catch (Exception e){} 
    } 
} 
+0

Tak, mój błąd, chociaż został zredagowany przez "Bart" minutę temu. Dzięki. – user1667191

+0

Dlaczego używasz wyrażeń regularnych? Dlaczego nie po prostu normalne 'String.Replace'? –

+0

Próbowałem również tej metody, ale znowu, nadal produkuje mój pierwotny problem. – user1667191

Odpowiedz

5

Wyrażenie regularne wygląda dobrze, ale widzę kilka rzeczy, które uniemożliwiają mu pracę:

for (int i = 0; i < (iEmo.Length/3); i++) 

Nie mam pojęcia, dlaczego dzielisz przez 3. Zamiast tego należy użyć długości pierwszego wymiaru:

for (int i = 0; i < iEmo.GetLength(0); i++) 

Dodatkowo, ze względu na kolejność, w której występują zamienniki, normalna zmarszczka ":(" zostanie wymieniona przed "złym" lico ">:(". Kiedy pętla trafi do złego przypadku, łańcuch wygląda jak ">Sad". Twój powinna zmienić swoje zamienniki w malejącej złożoności, coś takiego:

iEmo = new string[,] 
{ 
    {@">:\(", Evil}, 
    {@":\)", Smile}, 
    {@":\(", Sad}, 
    {@"8\)", Cool}, 
    {@":\|", Neutral}, 
    {@";\)", Wink}, 
    {@">:D", Twisted}, 
    {@":\?", Question,} 
}; 

I znowu normalna wymiana łańcuch będzie działać dobrze z powyższych zmian.

+0

Freaking niesamowite koleś dzięki! To naprawiło to !! – user1667191

Powiązane problemy