Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
RegExp question
Message
From
08/02/2017 18:14:58
 
 
To
08/02/2017 15:43:25
General information
Forum:
Visual FoxPro
Category:
Coding, syntax & commands
Title:
Environment versions
Visual FoxPro:
VFP 9 SP2
Miscellaneous
Thread ID:
01647702
Message ID:
01647735
Views:
78
Likes (1)
>Excelent. and with little more doctoring I added the Function too. plus including the name that follows.
>
>
>clear
>TEXT TO cText NOSHOW TEXTMERGE
>DEFINE CLASS test
>	PROCEDURE init
>		IF ATC("DEFINE CLASS",x)>0
>		*
>		ENDIF 
>		IF ATC("PROCEDURE",x)>0
>		*
>		ENDIF 
>		PROTECTED PROCEDURE something
>		ENDPROC 
>		HIDDEN PROCEDURE more_sss
>		ENDPROC 
>		FUNCTION me(xx)
>		ENDFUNC 
>	ENDPROC
>ENDDEFINE 
>ENDTEXT
>
>RegExp = NEWOBJECT( "_RegExp", "RegExp.vcx" )
>cpat = "^\s*(((hidd(e(n)?)?)|(prot(e(c(t(e(d)?)?)?)?)?))\s+)?((func(t(i(o(n)?)?)?)?)|(proc(e(d(u(r(e)?)?)?)?)?))\s*\w+"
>? cpat
>n=  RegExp.execute( ctext, cpat, .F., .T.)
>? n
>FOR i=1 TO n
>	?
>*	?? RegExp.Matches[i,1]
>	?? RegExp.Matches[i,2]
>*	?? substr(ctext, regexp.matches(i,1), 20)
>NEXT 
>
Three notes on this, the first concerning what I previously suggested, the others regarding your changes.

Whenever there is a reference to white space, that is, to "\s", change to "[ \t]": we don't want to have newline characters affecting the matches (otherwise, the pattern will add preceding blank to the matches, and accept broken statements as valid).

Then, after the PROCEDURE or FUNCTION keyword, we need at least a white space character, so it should be "+" instead of "*" (if not, PROCEDUREinit will match the pattern).

Finally, checking the name with "\w+" will fail to correctly interpret contained objects' methods. For instance
DEFINE CLASS test AS Form

  ADD OBJECT aButton AS CommandButton

  PROCEDURE aButton.Click
...
will match "PROCEDURE aButton", and I think you would like to match "PROCEDURE aButton.Click" (if I'm not mistaken).

So, a revised pattern could be
m.RegExp.pattern = "^[ \t]*(((hidd(e(n)?)?)|(prot(e(c(t(e(d)?)?)?)?)?))[ \t]+)?((func(t(i(o(n)?)?)?)?)|(proc(e(d(u(r(e)?)?)?)?)?))[ \t]+(\w+(\.\w+)?)"
----------------------------------
António Tavares Lopes
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform