方法一:TRegexp
首先有必要说明一下TRegexp支持的正则语法,因为TRegexp功能有限,实际上有很多正则语法是不支持的,比如()|,也就是说正反括号以及或运算符都不可以用于TRegexp中的正则表达式。TRegexp支持的语法如下:
'^'// start-of-line anchor
'$'// end-of-line anchor
'.'// matches any character
'['// start a character class
']'// end a character class
'^'// negates character class if 1st character
'*'// Kleene closure (matches 0 or more)
'+'// Positive closure (1 or more)
'?'// Optional closure (0 or 1)
TRegexp的详细说明见:http://root.cern.ch/root/html/TRegexp.html
经反复测试,得到一个TRegexp下可用的EMAIL电子邮件地址的正则表达式:
^[a-zA-Z0-9]+[_?[a-zA-Z0-9]+]*[a-zA-Z0-9]+@[a-zA-Z0-9]+.[a-zA-Z0-9]+[.[a-zA-Z0-9]+]*$
但仍然有问题:"abc_abc@sina.com.cn."最后的点是多余的,但是这样的字符串仍然通过了上述正则检查。原因在于我没有找到可以在TRegexp中有效替代"(.[a-zA-Z0-9]+)*"这样的表达的方法。
希望有人能够指正!
完整代码如下:
#include <Regexp.h>
TRegexpp("^[a-zA-Z0-9]+[_?[a-zA-Z0-9]+]*[a-zA-Z0-9]+@[a-zA-Z0-9]+.[a-zA-Z0-9]+[.[a-zA-Z0-9]+]*$");
unsigned int validlen;
int validstart =p.find(Edit2->Text.c_str(),&validlen); //X从0开始
if(validstart == -1 || validlen == 0)
{
return;
}
AnsiString result =Edit2->Text.SubString(validstart + 1,validlen);
ShowMessage(result);
方法二:VB SCRIPT
#definePG OlePropertyGet
#definePS OlePropertySet
#defineFN OleFunction
#definePR OleProcedure
Memo1->Clear();
VariantAxl =Variant::CreateObject("VBScript.RegExp"); //利用脚本里的正则
Axl.PS("Global", true);//全局匹配
Axl.PS("Pattern",Edit1->Text.c_str());//写入正则表达式
Variant rtn = Axl.FN("Execute",Edit2->Text.c_str());//开始执行
for (int i=0; i != rtn.PG("Count"); i++)
{
Memo1->Lines->A dd((rtn.PG("Item",i).PG("Value")));//取出匹配的东东
}
同样也测试了诸多种正则表达式,最终得到的比较满意的结果是:
^[a-zA-Z0-9]+(_+[a-zA-Z0-9]+)*@w+([-.]w+)*.w+([-.]w+)*$