ATL 正则表达式验证遇到中文出现异常!

robinswan 2005-06-01 02:51:23
用 CAtlRegExp 类验证用户输入,
但是当验证的字符串是中文的时候就出现未知异常,

#include <stdafx.h>
#include <atlrx.h>

int main(int argc, char* argv[])
{
CAtlRegExp<> re;
re.Parse(
"^{[\\._a-zA-Z0-9]}+\\@{[a-zA-Z0-9-]+\\.}+{{[a-zA-Z][a-zA-Z]}|{[a-zA-Z][a-zA-Z][a-zA-Z]}}$");

CAtlREMatchContext<> mc;

if( re.Match("中文测试",&mc) )
printf("OK");
else
printf("FAILED");

return 0;
}

我只需要验证邮件的输入等英文格式,
但是也要避免用书输入中时,程序崩溃。
如何避免呢?
...全文
175 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
柯本 2005-06-04
  • 打赏
  • 举报
回复
1.首先,安装boost,我以前回过的
http://community.csdn.net/Expert/topic/3938/3938537.xml?temp=.3305933
2.程序头上加
(你可在项目中加boost的include及lib路径,或将所有boost的 include拷入vc的include\boost目录.将lib拷入vc的lib目录)
#include <boost\regex.hpp>
using namespace boost;
3. 实现你的要求:就用以下简单的程序
regex H1("^[\\.\\w]+\\@[a-zA-Z0-9-]+\\.+[a-zA-Z]{2,3}$");
char input[] = "c_9c@s-dd.cc";
cmatch what;
if(regex_match(input,what,H1))
MessageBox("OK");
else
MessageBox("ERROR");

robinswan 2005-06-04
  • 打赏
  • 举报
回复
keiy() ( ):

关于中文输入是微软的那个com组件的漏洞,
我的微软的新闻组上得到别人的回答是这样的。

boost库是那个叫 regex++ 的组件吧,
我下了,但是似乎头绪太多。
我只要简单的对话框的用户输入检验。

有没有个简单完整的例子?
柯本 2005-06-02
  • 打赏
  • 举报
回复
改用boost就可以
regex H1("^[\\.\\w]+\\@[a-zA-Z0-9-]+\\.+[a-zA-Z]+$");
char input[] = "c_9c@s-dd.cc";
cmatch what;
if(regex_match(input,what,H1))
MessageBox("OK");
else
MessageBox("ERROR");
}
opentuxedo 2005-06-02
  • 打赏
  • 举报
回复
改一下正则表达式,好象在宽字节中,你的正则表达式只能匹配4个英文字符或两个中文字.没怎么用过正则表达式,你得自己查些资料.
柯本 2005-06-02
  • 打赏
  • 举报
回复
我试了下了,VC的CAtlRegExp不能对中文件处理,只要是中文,就会出错
解决方法:
1.加异常处理
try {

if( re.Match("中文测试",&mc) )
printf("OK");
else
printf("FAILED");
}
catch(...)
{
printf("error");
}
2.改用boost库
我上面的有一点小问题,这样就完全符合你的要求(CAtlRegExp的正则表达式是非标的)
regex H1("^[\\.\\w]+\\@[a-zA-Z0-9-]+\\.+[a-zA-Z]{2,3}$");
robinswan 2005-06-01
  • 打赏
  • 举报
回复
对不起,是正确的英文输入,打错了。
比如:

guest@csdn.net

仍然是匹配不到的,指针类型转换的错误。
robinswan 2005-06-01
  • 打赏
  • 举报
回复
回复人: opentuxedo(借哥哥的号来试试)

>>>>>>>>>>>>>>>>>>>

这样的话就连正确的中文输入都匹配不到了!!!
不知道这位大侠,你是否遇到过这样的情况。
opentuxedo 2005-06-01
  • 打赏
  • 举报
回复
可以用CAtlRECharTraitsW对付中文。
CAtlRegExp<CAtlRECharTraitsW> re;
re.Parse(
(CAtlRegExp<CAtlRECharTraitsW>::RECHAR*)("^{[\\._a-zA-Z0-9]}+\\@{[a-zA-Z0-9-]+\\.}+{{[a-zA-Z][a-zA-Z]}|{[a-zA-Z][a-zA-Z][a-zA-Z]}}$"));

CAtlREMatchContext<CAtlRECharTraitsW> mc;

if( re.Match((CAtlRegExp<CAtlRECharTraitsW>::RECHAR*)("abcd@aa.com"),&mc) )
printf("OK");
else
printf("FAILED");

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧