我有一种情况,我不知道如何准确定义它。我有允许我从文本中提取特定模式的正则表达式函数:我总共有 9 个函数:
bool extractDate(const char *);
bool extractHeureFax(const char*);
bool extractFaxPhone(const char*);
bool extractFormePolitesse(const char*);
bool extractCodePostal(const char*);
bool extractDate2(const char*);
bool extractTelephone2(const char*);
bool extractNumbers(const char*);
bool extractalphanumeric(const char*);
bool extractnumeric(const char*);
bool extractPageNumber(const char*);
问题是每次他们想要添加正则表达式时,他们都必须修改整个 代码,这不是一个好主意。
他们的解决方案之一是将所有正则表达式放在一个文本文件中。所以每次他们想要添加一个新的正则表达式时,他们可以将它添加到文本文件中,并在运行时加载它们。文本中的每个正则表达式都包含 ID 和 RE 示例:
DATE: ^([0]?[1-9]|[1|2][0-9]|[3][0|1])([\\.\\-\\/\\ ])([0]?[1-9]|[1][0-2])([\\.\\-\\/\\ ])([0-9]{4}|[0-9]{2})$
HEURE: ([0-1][0-9]|[2][0-3]):([0-5][0-9])$
TELEPHONE: ^(01|02|03|04|05|06|08)(([\\.\\-\\/\\ ])?[0-9][0-9]){4}
FORMULE POLITESSE: ^((c|C)ordialement|Sinc(è|\u00E8)rement|Sinc(è|\u00E8)re|croire|agr(é|\u00E9)er|agreer|l'expression|distingu(é|\u00E9)s|sentiments|salutations|consid(e|é|\u00E9)ration)$
CODE POSTAL: ^((0[1-9])|([1-8][0-9])|(9[0-8])|(2A)|(2B))[0-9]{3}$
然后将文本保存在向量中并尝试所有正则表达式,直到找到正确的表达式。
代码内部: 这就是我处理函数的方式
if(extractDate(e->getName().c_str()))
{
e->setType(0);
}
else if(extractHeureFax(e->getName().c_str()))
{
e->setType(1);
// int x0 = e->getXCenter();
// int y0 = e->getYCenter();
// markPoints(xmlFile,x0,y0,20,0,255,0);
}
//TELEPHONE = BLEU
else if(extractFaxPhone(e->getName().c_str()))
{
e->setType(2);
}
else if(extractCodePostal(e->getName().c_str()))
{
e->setType(3);
}
ExtractDAte()、ExtractHeureFax() 等是正则表达式函数:
bool Keywords::extractCodePostal(const char * code)
{
// cout <<"code postal"<<endl;
const boost::regex e("^((0[1-9])|([1-8][0-9])|(9[0-8])|(2A)|(2B))[0-9]{3}$");
return boost::regex_match(code,e);
}///end function
bool Keywords::extractDate2(const char*date2)
{
const boost::regex e("((j|J)anvier|(f|F)\u00E9vrier|(f|F)évrier|(f|F)evrier|(m|M)ars|(a|A)vril|(m|M)ai|(j|J)uin|(j|J)uillet|juillet|(a|A)o\u00FBt|(a|A)oût|aout|(s|S)eptembre|(o|O)ctobre|(n|N)ovembre|(d|D)\u00E9cembre|(d|D)écembre|(d|D)ecembre|JANVIER|FEVRIER|MARS|AVRIL|MAI|JUIN|JUILLET|AOUT|SEPTEMBRE|OCTOBRE|NOVEMBRE|DECEMBRE)");
return boost::regex_match(date2,e);
}///end function