[C#] Klasa Regex - wylapywanie znacznikow

0

Aktualnie pisze metodę, która analizuje tekst pod katem wystąpienia znaczników "[b]" oraz "[/b]".
Piszę kod, który analizuje znak po znaku, ale zastanawiam się czy użycie metod klasy Regex nie było by łatwiejsze. Tylko stanąłem na etapie ujęcia warunków opisujących sytuację w wyrażenie regularne.

Metoda wczytywała by cała linię z pliku, i zwracała by póki co sam tekst pomiędzy znacznikami.
Jak ktoś wie jak napsiać takie wyrażenie regularne prosił bym o pomoc.

Pzdr

0

Tak na szybko.

string text = "To jest jakiś tekst który zawiera znaczniki [b],które definiują zapewne pogrubienie[/b] tekstu.";
string pogrubionyTekst = Regex.Match(text, @"\[b\](.*)\[/b\]").Groups[1].Value;

Oczywiście możesz napisać to sprytniej, tak że wyciągnie ci tekst pomiędzy dowolnymi znacznikami a nie tylko [b].

0
PawelLukasik napisał(a)

Tak na szybko.

string text = "To jest jakiś tekst który zawiera znaczniki [b],które definiują zapewne pogrubienie[/b] tekstu.";
string pogrubionyTekst = Regex.Match(text, @"\[b\](.*)\[/b\]").Groups[1].Value;

Oczywiście możesz napisać to sprytniej, tak że wyciągnie ci tekst pomiędzy dowolnymi znacznikami a nie tylko [b].

Dzięki
Już wiem jaki błąd robiłem, pisałem: @"[b].*[/b]"...

Miłej nocki

0

A czy można lekko edytować ten kod, aby otrzymać:
tekst dopasowany, oraz teksty z przed i zza znaczników? pzdr

0

No można...

var znalezione = Regex.Match(text, @"(.*)\[b\](.*)\[/b\](.*)");

Console.WriteLine(string.Format("{0} {1} {2}", znalezione.Groups[1].Value, znalezione.Groups[2].Value,
                  znalezione.Groups[3].Value));
0
PawelLukasik napisał(a)

No można...

var znalezione = Regex.Match(text, @"(.*)\[b\](.*)\[/b\](.*)");

Console.WriteLine(string.Format("{0} {1} {2}", znalezione.Groups[1].Value, znalezione.Groups[2].Value,
                  znalezione.Groups[3].Value));

wow, dzięki ;p

0

No tak, ale zobacz co Ci ten Twój RegExp zwróci dla:
"ab [b] cd [/b] ef [b] gh [/b] ij"
Raczej nie tego oczekujesz ;-)

0

Czyli mówiąc jednym słowem (znakiem) po * dodaj ? ;).

0

To wtedy problemem będzie zagnieżdżenie:

"ab [b] cd [b] ef [/b] gh [/b] ij"

Konkludując: RegExp nie jest dobry do takich potrzeb.

0

Konkludując: zależy od potrzeb.

Może autor potrzebuje tylko podstawowy przypadek i nie interesują go zagnieżdżenia ani wiele zaznaczonych bloków.

0

Tego nie wiemy, dlatego warto uczulić na takie [ewentualne] problemy.

0

Ja bym się nie zgodził, że regex się do tego nie nadaje. Co prawda nie jest on przystępny dla ludzi ale dobrze opanowany jest potężnym narzędziem. Kolega który chce parsować znaczniki typu "otwórz" "zamknij" musi skorzystać z "Balancing Groups" które jest w .Net Regex. Za ich pomocą można opanować hierarchiczne struktury i na pewno będzie to łatwiejsze niż "ręczne" uwzględnianie wszystkich przypadków bo to wymagałoby napisania prostego parsera

0

Generalnie operuję w zakresie perlowskiej składni RegExp [najpopularniejszej], a tam nie ma takich atrakcji jak "Balancing Groups". Przynajmniej dowiedziałem się czegoś nowego :)
Ale gdyby nie ta specyficzna dla .NET zaleta, to RegExp odpada - przyznasz.

0

Tak ! Zgadzam się w zupełności. Regex tradycyjny to implementacja maszyny skończonej bez stosu co uniemożliwia parsowanie wyrażeń zagnieżdżonych.

Na szczęście ten szczegół uwzględnili w .NET :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1