Toon posts:

[C#/Regex] Niet té greedy én un-greedy

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo ieders,

Ik heb deze lap tekst:
code:
1
2
3
4
{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sectrsid1925357\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}
{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}
{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9
\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0


Nu wil ik met een reguliere expressie er stukken tussen uit slopen. Alles wat tussen een {\* en } staat. Daar tussen is het mogelijk dat er nog iets tussen brackets geplaatst wordt .... Bijvoorbeeld dus:
code:
1
{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}


Mijn regex-patroon is op dit moment: (\{\\\*(.*?)\}) en pakt van boven staand voorbeeld 'slechts' :
code:
1
{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}


Als iemand mij hiermee kan helpen dan wordt ik daar erg blij van :D

Groetjes op deze zonnige dag.

Verwijderd

Verwijderd schreef op dinsdag 27 maart 2007 @ 16:04:
Mijn regex-patroon is op dit moment: (\{\\\*(.*?)\})
Als ik deze regex zo zie dan doet hij wat jij wilt. Hij zoekt één maal op die regex. Als ik me goed herinner hoe die expressions werken, zal je achter die regex een * moeten zetten. Op die manier zal gekeken worden of die regex 0 of meerdere malen voorkomt. In jouw geval komt iets tussen {\* } vaker voor, dus wil je niet kijken of het patroon maar één keer voorkomt.

Verwijderd

Topicstarter
Regex doet het prima, vindt dus meerdere resultaten.

Zoals hierboven aangegeven wordt er dus maar een deel gevonden, doordat er een andere sluitings bracket voor staat } , maar deze hoort bij de gene die ervoor wordt geopend.
Bijvoorbeeld dus:
code:
1
{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}
Zie: Bijvoorbeeld dus:

[ Voor 24% gewijzigd door Verwijderd op 27-03-2007 16:28 ]


Verwijderd

Het lijkt mij dan dat je voor de uiteindelijke sluitbracket ook iets van een asterisk moet zetten, net zoals bij de openingsbracket staat. Ik zou zo niet weten of het mogelijk is met een regex om af te vangen dat er een sluitbracket bij een andere openingsbracket in die regel hoort.

Misschien zou je de regel vooraf moeten voorbewerken zodat je geen last hebt van die brackets, die je nu alleen in de weg staan.

Edit:
Uitgaande van jouw regex en iets wat me ineens te binnen schiet.
code:
1
(\{\\\*(.*?)(\{\\.*?\})*\})

[ Voor 26% gewijzigd door Verwijderd op 27-03-2007 16:40 ]


Verwijderd

Topicstarter
Geweldig _/-\o_

Ook helemaal niet aan gedacht. Ben ook niet echt into reguliere expressies. Maar als het met een regex kan, dan scheelt het weer programmeer werk, terwijl dit een boel tijd kan schelen!

Dit is m uiteindelijk geworden:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
    public class RegularExpression
    {
        
        private void Test()
        {
            string regex = "(\\{\\\\\\*(.*?)(\\{\\\\.*?\\})*\\})";
            System.Text.RegularExpressions.RegexOptions options = (((System.Text.RegularExpressions.RegexOptions.IgnorePatternWhitespace | System.Text.RegularExpressions.RegexOptions.Singleline) 
                        | System.Text.RegularExpressions.RegexOptions.Multiline) 
                        | System.Text.RegularExpressions.RegexOptions.IgnoreCase);
            System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(regex, options);
        }
    }


Deze code is gegenereerd vanuit The Regulator, dus moet nog iets doen met de matches, maar dat komt goed 8)

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Verwijderd schreef op dinsdag 27 maart 2007 @ 16:04:
Hallo ieders,

Mijn regex-patroon is op dit moment: (\{\\\*(.*?)\})

Groetjes op deze zonnige dag.
zoiets, misschien?

( \ { \\ \* ( [^\{]* ( \{ [^\}]* \} )* [^\}]* \} )

alleen los je dan nog niet op als in de geneste accolades ook weer accolades zijn genest...

edit : oh, ik heb er te lang over nagedacht... inmiddels heb je al een oplossing :) succes er verder mee!

[ Voor 11% gewijzigd door P.O. Box op 27-03-2007 16:47 ]


Verwijderd

Topicstarter
Edwardvb schreef op dinsdag 27 maart 2007 @ 16:47:edit : oh, ik heb er te lang over nagedacht... inmiddels heb je al een oplossing :) succes er verder mee!
aaaw patpat ^____^ many thanks for thinking!

[ Voor 27% gewijzigd door Verwijderd op 27-03-2007 16:52 ]


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Zo te zien is het een stukje Latex-markup of Postscript? D'r is natuurlijk een reden dat de parsers voor dergelijke teksten met parser-generators werken ipv regexpen ;) En dat is precies dat je in theorie oneindige nesting in tags mag hebben.
Zeker als het postscript is, is er een grote kans dat er uberhaupt wel een of andere module voor beschikbaar is? En dan bespaar je werk (mits het goed integreerbaar is), is het waarschijnlijk sneller (recursie in regexpen is niet zo vlot) en in veel gevallen beter (tenzij je enkel relatief simpele structuren hebt).

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 06-11 13:54
Nog een tip voor het werken met strings in c#, gebruik de @ voor een string. Dan hoef je een backslash niet te escapen.
C#:
1
string regex = @"(\{\\\*(.*?)(\{\\.*?\})*\})"; 


Verder ben ik het met ACM eens.

Verwijderd

Topicstarter
Het is een deel van RTF ;-)

Ik wil de rommel van Microsoft eruit slopen .... My god... wat office 2007 er wel niet bij inpleurt ...

[ Voor 81% gewijzigd door Verwijderd op 28-03-2007 09:55 ]

Pagina: 1