📄 regexp.h
字号:
#ifndef __REGEXP_H__
#define __REGEXP_H__
////////////////////////////////////////////////////////////////////////
// RegExp.h
//
// This code has been derived from work by Henry Spencer.
// The main changes are
// 1. All char variables and functions have been changed to TCHAR
// counterparts
// 2. Added GetFindLen() & GetReplaceString() to enable search
// and replace operations.
// 3. And of course, added the C++ Wrapper
//
// The original copyright notice follows:
//
// Copyright (c) 1986, 1993, 1995 by University of Toronto.
// Written by Henry Spencer. Not derived from licensed software.
//
// Permission is granted to anyone to use this software for any
// purpose on any computer system, and to redistribute it in any way,
// subject to the following restrictions:
//
// 1. The author is not responsible for the consequences of use of
// this software, no matter how awful, even if they arise
// from defects in it.
//
// 2. The origin of this software must not be misrepresented, either
// by explicit claim or by omission.
//
// 3. Altered versions must be plainly marked as such, and must not
// be misrepresented (by explicit claim or omission) as being
// the original software.
//
// 4. This notice must not be removed or altered.
/////////////////////////////////////////////////////////////////////////////
#define NSUBEXP 10
#include "StringEx.h"
class CRegExp
{
public:
CRegExp();
~CRegExp();
CRegExp *RegComp( const TCHAR *re );
int RegFind(const TCHAR *str);
TCHAR* GetReplaceString( const TCHAR* sReplaceExp );
int GetFindLen()
{
if( startp[0] == NULL || endp[0] == NULL )
return 0;
return endp[0] - startp[0];
}
private:
TCHAR *regnext(TCHAR *node);
void reginsert(TCHAR op, TCHAR *opnd);
int regtry(TCHAR *string);
int regmatch(TCHAR *prog);
size_t regrepeat(TCHAR *node);
TCHAR *reg(int paren, int *flagp);
TCHAR *regbranch(int *flagp);
void regtail(TCHAR *p, TCHAR *val);
void regoptail(TCHAR *p, TCHAR *val);
TCHAR *regpiece(int *flagp);
TCHAR *regatom(int *flagp);
// Inline functions
private:
TCHAR OP(TCHAR *p) {return *p;};
TCHAR *OPERAND( TCHAR *p) {return (TCHAR*)((short *)(p+1)+1); };
// regc - emit (if appropriate) a byte of code
void regc(TCHAR b)
{
if (bEmitCode)
*regcode++ = b;
else
regsize++;
};
// regnode - emit a node
TCHAR * regnode(TCHAR op)
{
if (!bEmitCode) {
regsize += 3;
return regcode;
}
*regcode++ = op;
*regcode++ = _T('\0'); /* Null next pointer. */
*regcode++ = _T('\0');
return regcode-3;
};
private:
BOOL bEmitCode;
BOOL bCompiled;
TCHAR *sFoundText;
TCHAR *startp[NSUBEXP];
TCHAR *endp[NSUBEXP];
TCHAR regstart; // Internal use only.
TCHAR reganch; // Internal use only.
TCHAR *regmust; // Internal use only.
int regmlen; // Internal use only.
TCHAR *program; // Unwarranted chumminess with compiler.
TCHAR *regparse; // Input-scan pointer.
int regnpar; // () count.
TCHAR *regcode; // Code-emit pointer; 甦ummy = don't.
TCHAR regdummy[3]; // NOTHING, 0 next ptr
long regsize; // Code size.
TCHAR *reginput; // String-input pointer.
TCHAR *regbol; // Beginning of input, for ^ check.
};
int RegSearchReplace(CStringEx& string, LPCTSTR sSearchExp,
LPCTSTR sReplaceExp );
int RegSearchFind(CRegExp& r, CStringEx& string, LPCTSTR sSearchExp,
long startPos, long& len);
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -