2025-11-27 16:46:48 +09:00
..
new
2025-11-27 16:46:48 +09:00
new
2025-11-27 16:46:48 +09:00
new
2025-11-27 16:46:48 +09:00
new
2025-11-27 16:46:48 +09:00
new
2025-11-27 16:46:48 +09:00
new
2025-11-27 16:46:48 +09:00
new
2025-11-27 16:46:48 +09:00
new
2025-11-27 16:46:48 +09:00
new
2025-11-27 16:46:48 +09:00
new
2025-11-27 16:46:48 +09:00
new
2025-11-27 16:46:48 +09:00
new
2025-11-27 16:46:48 +09:00
new
2025-11-27 16:46:48 +09:00
new
2025-11-27 16:46:48 +09:00
new
2025-11-27 16:46:48 +09:00
new
2025-11-27 16:46:48 +09:00
new
2025-11-27 16:46:48 +09:00
new
2025-11-27 16:46:48 +09:00
new
2025-11-27 16:46:48 +09:00
new
2025-11-27 16:46:48 +09:00
new
2025-11-27 16:46:48 +09:00
new
2025-11-27 16:46:48 +09:00
new
2025-11-27 16:46:48 +09:00
new
2025-11-27 16:46:48 +09:00
new
2025-11-27 16:46:48 +09:00
new
2025-11-27 16:46:48 +09:00
new
2025-11-27 16:46:48 +09:00
new
2025-11-27 16:46:48 +09:00

COXRegular - new class that implements regular expression functionality.


				Most of us had problems with searching some text in text files.
				Yes, we can use searching capabilities that are provided with
				many programs. But, in case we have to do some generic search
				it is not the case. For such cases COXRegular class is exactly
				what we had to have. This class provided generic search regarding
				the rule you've supplied. To do search, you have to load regular 
				expression that defines what do you want to search. There are
				different formats and different implementation for regular expression.
				This implementation is most close to that one described in
				MSDN that comes with Visual Studio 6.0

	The rules:

  Character				 Description

		\		 Marks the next character as special. All characters that are
				 special but you want to define it for search should be 
				 preceding by this character.
		^		 Matches the begining of input or line. In this implementation this 
				 cannot be defined in charset.
		$		 Matches the end of input or line. In this implementation this 
				 cannot be defined in charset.
		*		 Matches preceding character zero or more times. In this implementation
				 cannot be defined if only one character specified in the regular
				 expression. That means that /zo*/ matches z and zoo, but
				 /z*/ will match nothing because only one character has been specified.
		+		 Matches preceding character one or more times. 
		?		 Matches preceding character zero or one time. In this implementation
				 cannot be defined if only one character specified in the regular
				 expression.
		.		 Matches any single character except '\n'
	(pattern)	 Matches pattern and remembers the match. The matched substring can
				 be retrieved by using '\0'-'\9' in regular expression, where '0'-'9'
				 are number of the pattern. Example:
				 regular expression '(re).*\0s+ion' will match 'regular expression'
				 because first matches pattern 're' and remember the pattern with
				 index 0. '.*' will match 'gular exp' in 'regular expression'.
				 Now we rettrieve pattern with index 0, that has been remembered
				 with index 0, this is 're' that matches 're' in 'regular expression'
				 before 'ssion' and , finally, 's+ion' matches 'ssion'
	   x|y		 Matches either character 'x' or 'y'. You can combine more than two
				 characters like 'x|y|z'
	   {n}		 Means preceding character will match exactly n times (nonnegative, of course)
	  {n,}		 Means preseding character will match at least n times (nonnegative)
	  {n,m}		 Means preceding character will match at keast n times and at 
				 most m times. (n,m - nonnegative)
	  [xyz]		 A character set. Matches any one of enclosed characters
	 [^xyz]		 A non-matching character set. Matches any character that is not in the set.
		\b		 Matches word boundary, that is boundary between any character excluding 
				 space characters (" \f\n\r\t\v") and space characters
		\B		 Matches non-word boundary. Matches any boundary between space 
				 characters or between nonspace characters.
		\d		 Matches any digit /0-9/
		\D		 Matches any non-digit.
		\f		 Matches a formfeed.
		\n		 Matches a new-line character
		\r		 Matches a carridge return character.
		\s		 Matches any white space character
		\S		 Matches any non-white space character
		\t		 Matches a tab character
		\v		 Matches any vertical tab character
		\w		 Matches any word character including underscore. [A-Za-z0-9_]
		\W		 Matches any non-word character (any character that does not match \w)
		\num	 Where num is number between 0 and 9. Matches remmembered pattern.
				 (See description of pattern)
		/n/		 Where n is between 1 and 255. Matches supplied in n ASCII code


	Three easy steps to use:
	1) Create your own derived from COXRegular class and override function OnMatch()
	   This virtual function is always called when a matched substring has been found.
	   When this function is called you can return TRUE to continue search or FALSE
	   if you do not want continue search.
	2) Load your regular expression by function LoadRule()
  	3) Call function Match to do the search in supplied text.


	Now how it works.
	There are two steps in the work -1)load regular expression and 2) search the text

1)load regular expression
  When you are loading regular expression, LoadRule() calls function Parse() that
  has a huge switch. This function do parsing of the rule and create tags of different
  types for every sequences of special characters, depends on the type of special 
  characters. For some special characters founded it calls appropriate functions
  like GetAsciiChar() or GetEither() to do this special parsing. The tags are added
  to the collection of tags. Any tag can be retrieved by GetTag().
  The function Parse is virtual, so, if you need to process some special characters,
  that are not specified here, you can override it. Once Parse() or called subfunction
  found error, Parce stops parsing and returns FALSE. You can retrieve error code
  by GetError() and translate it to description by TranslateError()

2) search the text
  The search text makes function Match() that call recursive function MatchNextTag()
  with start tag number=0. Match() does loop, every time incrementing start position
  in the supplied text for the search untill end of the text has been reached.
  MatchNextTag() does main job and once the tag matches the text at the specified
  position does either, call OnMatch() if the tag was last in the collection of the tags
  or calls MatchNextTag() to match next tag from the collection.

  The function MatchNextTag() like Parse() is virtual, so, it's up to you override it
  if you want to process some special sequences.