[ manda @ 08.04.2009. 23:10 ] @
Imam Regex:

<vrti>((.*\n*)+)</vrti>

Za primere tipa

<vrti>dasdasets srt bsr tb trbr </vrti>

radi ok. Problem nastaje kada imam ulazni string koji ima više pojavljivanja, npr.:

<vrti>dasdasets srt bsr tb trbr </vrti> <vrti> abcde ttt dfdgf1234,.,.<>>>> </vrti>


U ovom slučaju match-ovanje mi ne vraća 2 (...) match-aa, već samo jedan, budući da praktično ceo izraz počinje sa <vrti>, a završava sa </vrti>.

Takodje,

<vrti> abc </vrti> </vrti>


mi ne vraća "<vrti> abc </vrti>", već "<vrti> abc </vrti> </vrti>".


Ono što hoću je da mi vrati sve matcheve koji počinju sa "<vrti>", a završavaju sa "</vrti>", a da string izmedju ne sadrži nijedan od ovih krajnjih stringova. Drugim rečima, hteo bih da negiram pojavljivanje celog jednog stringa (nije problem sa jednim karakterom (^), ali kako da negiram pojavljivanje celog stringa)

Ima li neko rešenje?
[ Aleksandar Ružičić @ 08.04.2009. 23:26 ] @
pogledaj lookahead assertion.
[ mmix @ 09.04.2009. 09:45 ] @
mislim da je ovde krace resenje lazy quantifier, mada bi mozda lookahead assertion imao manje koraka posto lazy quantifier backtrackuje posle svakog karaktera.

<vrti>(.*?)</vrti>


PS: umesto (.*\n*)+ koristi .* sa ukljucenim s (Singleline) flegom, taj fleg tretira \n kao normalan karakter (. ga matchuje). Brze je jer ima manje petlji da matchuje.
[ mmix @ 09.04.2009. 10:01 ] @
Nije, probao sam sa lookahead i ima vise koraka za isti ulaz, brzi je lazy quantifier.

<vrti>(.(?<!</vrti>))*</vrti>


A i ovo je za AoP, enma veze sa .NETom...
[ vbvlada @ 12.02.2010. 12:14 ] @
Iskoristio bih ovu temu da probam da rešim moj problem koji je jako sličan, ali ne znam zašto mi ne radi...

Konkretno radim sa word dokumentom snimljenim u XML i imam jednu tabelu koja ima 1 row kao zaglavlje, koje je inače posebno formatirano,
a ispod tog reda mi je jedan sample row, pomoću kojeg kopiranjem stringa želim da napravim još N redova, koji su istog formatiranja.
To bi mi kasnije omogućilo lakšu izmenu ako se promene formatiranja.

Problem, koji je jako sličan ovom: hoću da izvučem taj sample row koji izgleda ovako:
Code:
<w:tr ...brdo atributa ...>... brdo tagova... </w:tr>


probao sam sa ovim:
Code:
<vrti>(.*?)</vrti>
ali mi vraca samo taj prvi red koji mi ne treba vec mi treba red ispod njega.

Način na koji bih prepoznao red je da sam u ćelije kao podatke stavio nešto tipa #1,1# (row=1, col=1).

Ali evo ovaj kod mi ne vraća to što tražim;

Code:
string toTest = reader.ReadToEnd();

            Regex r = new Regex(@"<w:tr(.*)</w:tr>");
            Match match = r.Match(toTest);
            string rr = match.ToString();
            //MessageBox.Show(rr);
            //textBox1.Text = rr;
            string rez = "";
            foreach (Group g in match.Groups)
            {
                if (!g.Value.Contains("#1,"))
                    continue;
                rez = g.Value;
            }
            textBox1.Text = rez;


Moguće je da sam pogrešno razumeo Groups svojstvo, mislio sam da je tu niz match-ova..

[Ovu poruku je menjao vbvlada dana 12.02.2010. u 13:26 GMT+1]