ATL 正则表达式验证遇到中文出现异常!
用 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;
}
我只需要验证邮件的输入等英文格式,
但是也要避免用书输入中时,程序崩溃。
如何避免呢?
问题点数:100、回复次数:8Top
1 楼opentuxedo(借哥哥的号来试试)回复于 2005-06-01 16:33:41 得分 0
可以用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");
Top
2 楼robinswan()回复于 2005-06-01 22:31:01 得分 0
回复人: opentuxedo(借哥哥的号来试试)
>>>>>>>>>>>>>>>>>>>
这样的话就连正确的中文输入都匹配不到了!!!
不知道这位大侠,你是否遇到过这样的情况。Top
3 楼robinswan()回复于 2005-06-01 22:32:38 得分 0
对不起,是正确的英文输入,打错了。
比如:
guest@csdn.net
仍然是匹配不到的,指针类型转换的错误。Top
4 楼opentuxedo(借哥哥的号来试试)回复于 2005-06-02 09:12:07 得分 0
改一下正则表达式,好象在宽字节中,你的正则表达式只能匹配4个英文字符或两个中文字.没怎么用过正则表达式,你得自己查些资料.Top
5 楼keiy()回复于 2005-06-02 11:19:04 得分 100
改用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");
}Top
6 楼keiy()回复于 2005-06-02 15:46:49 得分 0
我试了下了,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}$");
Top
7 楼robinswan()回复于 2005-06-04 10:14:09 得分 0
keiy() ( ):
关于中文输入是微软的那个com组件的漏洞,
我的微软的新闻组上得到别人的回答是这样的。
boost库是那个叫 regex++ 的组件吧,
我下了,但是似乎头绪太多。
我只要简单的对话框的用户输入检验。
有没有个简单完整的例子?Top
8 楼keiy()回复于 2005-06-04 11:36:53 得分 0
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");
Top




