[RegEx] Resultaat te groot

Pagina: 1
Acties:

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
Ik ben bezig met een projectje om snel mijn classes e.d. te documenteren. Ik jas de projectfiles door mijn progje, waarna het progje alle classes (en forms, modules enz) door een regex jast.

Alle declaraties worden door die regex eruit gefilterd, en in een XML bestand gegooid, zodat ik er later met een XSL weer mooie documentatie van kan maken.

Nu probeer ik mijn Enums ook in die XML file te gooien, en daar loop ik tegen een probleem aan.

Tot nu toe heb ik gewoon alle declaraties kunnen lezen als ze beginnen met Private/Public/Friend enzovoorts tot het eind van de regel. De regex die ik daar voor gebruik is de volgende:
code:
1
[\t ]*(Private|Public|Friend)+ (Static|WithEvents)?(Const|Type|Property|Function|Sub|Event)*.*[^\s]


Hiermee krijg ik netjes alle declaraties en andere zut die ik in mijn documentatie wil opnemen terug.

Nu loopt een enum over meerdere regels:

code:
1
2
3
4
5
Private myEnum
  rood
  groen
  blauw
End Enum


Die kan ik nog aardig matchen. Maar nu heb ik de volgende code:
code:
1
2
3
4
5
6
7
8
9
10
11
Private myEnum1
  rood
  groen
  blauw
End Enum

Private myEnum2
  jantje
  pietje
  klaasje
End enum


Deze krijg ik nu als 1 match terug, in plaats van 2 losse matches. Dit omdat de regex probeert een zo groot mogelijke match te maken. Het pattern dat ik gebruik is als volgt:

code:
1
[\t ]*(Private|Public|Friend)+ Enum*.*(\s|\S)*.*[^\s]*[\t ]*End Enum


Hoe krijg ik mijn regex nu zo ver om hier 2 matches van te maken? Ik heb het volgende al geprobeerd, zonder resultaat:

code:
1
2
[\t ]*(Private|Public|Friend)+ Enum*.*(\s|\S)*.*[^\s]*[\t ]*End Enum[\S]
[\t ]*(Private|Public|Friend)+ Enum*.*(\s|\S)*.*[^\s]*[\t ]*^(End Enum)End Enum


en allerlei varianten daarop. De helft werkt niet, geeft teveel terug of klapt eruit door teveel matches...

Ik gebruik, mocht dat niet duidelijk zijn, VB6 en het VBScript.Regex object.

Iemand enig idee? Ik zit altijd te ruziën met regexen 8)7

[ Voor 3% gewijzigd door RobIII op 21-06-2004 16:28 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

Volgens mij kon je iets doen met objRegExp.Global op true of juist false zetten. Verder is er niet echt een manier om op greediness te letten in dat VBScript object geloof ik.

Je weet trouwens toch wel dat (\s|\S) hetzelfde is als * he? ;)

[ Voor 46% gewijzigd door NMe op 21-06-2004 16:50 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

NMe84 schreef op 21 juni 2004 @ 16:29:
Je weet trouwens toch wel dat (\s|\S) hetzelfde is als * he? ;)
Als . toch?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

Kan ook... :X

Dat ^(End Enum) werkt volgens mij ook niet trouwens, volgens mij mag die ^ alleen in rechte haken, anders wordt ie geïnterpreteerd als het begin van een regel...

[ Voor 30% gewijzigd door NMe op 21-06-2004 16:50 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
NMe84 schreef op 21 juni 2004 @ 16:29:
Volgens mij kon je iets doen met objRegExp.Global op true of juist false zetten. Verder is er niet echt een manier om op greediness te letten in dat VBScript object geloof ik.

Je weet trouwens toch wel dat (\s|\S) hetzelfde is als * he? ;)
Uit de MSDN:
. Matches any single character except a newline character.
Dan is (\s|\S) toch niet hetzelfde als . ?

Ik ga effe checken of het aan me global ligt ;)

Nope. Global op True of False haalt geen fluit uit... :?

[ Voor 6% gewijzigd door RobIII op 21-06-2004 16:54 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Met regular expressions moet je het verschil tussen Greedy en Lazy goed in de gaten houden.

klik
*? (lazy star)

Repeats the previous item zero or more times. Lazy, so the engine first attempts to skip the previous item, before trying permutations with ever increasing matches of the preceding item.

".*?" matches "def" in abc "def" "ghi" jkl

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Topicstarter
(overleden)
Verwijderd schreef op 21 juni 2004 @ 17:11:
Met regular expressions moet je het verschil tussen Greedy en Lazy goed in de gaten houden.

klik


[...]
Hebbes! Thanks alot! _/-\o_

De oplossing is als volgt:
code:
1
[\t ]*(" & cScopes & ")+ Enum .*(\s|\S)*?End Enum

[ Voor 3% gewijzigd door RobIII op 21-06-2004 17:25 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1