首页 > 其他分享 >使用CAtlRegExp正则表达式检查浮点数输入

使用CAtlRegExp正则表达式检查浮点数输入

时间:2022-12-13 20:35:39浏览次数:66  
标签:case return 正则表达式 TEXT 浮点数 REPARSE -+ ERROR CAtlRegExp


一、VS2008(Sp1)环境使用CAtlRegExp类需要额外下载ATL Server,(因为开源代码,没集成在VS2008里了) http://atlserver.codeplex.com/


二、下载后解压,如F:\CPP\ATL_Server_Source_and_Headers_9_0_70425_Alpha


然后设置路径:【工具】->【选项】->【项目和解决方案】->【VC++目录】,在【包含文件】添加目录 F:\CPP\ATL_Server_Source_and_Headers_9_0_70425_Alpha\include



三、使用方法



    (1)、h文件中



包含头文件  


     #include <atlrx.h>


变量


CString m_szPixels;



float m_nPixels;



定义函数



static CString REError2String(REParseError status);





    (2)、CPP实现文件


主要代码添加在DoDataExchange();

void CPageMeasument::DoDataExchange(CDataExchange* pDX)




{




CPropertyPage::DoDataExchange(pDX);




DDX_Text(pDX, IDC_EDIT1, m_szPixels);




DDX_Text(pDX, IDC_EDIT2, m_nDefaultZoomFactor);




DDX_Control(pDX, IDC_COMBO_UNITS, m_cboUnits);








CString szErr(_T("Parser Error:"));









if ( pDX->m_bSaveAndValidate ) {


// create regular expression content


CAtlRegExp<> regex;


REParseError status = regex.Parse(L"^{[-+]?\\d+}{\\.}?{\\d*}{[eE][-+]?\\d+}?$");


if (REPARSE_ERROR_OK != status) {


// invalid pattern, show error





} else {


// valid regex pattern, now try to match the content


CAtlREMatchContext<> mc;


if (!regex.Match(m_szPixels, &mc)) {


// content not match


m_szPixels = _T("");


m_nPixels = -1;


} else {


// content match, show match-group like this


// for (UINT nGroupIndex = 0; nGroupIndex < mc.m_uNumGroups; ++nGroupIndex)


// {


// const CAtlREMatchContext<>::RECHAR* szStart = 0;


// const CAtlREMatchContext<>::RECHAR* szEnd = 0;


// mc.GetMatch(nGroupIndex, &szStart, &szEnd);


// ptrdiff_t nLength = szEnd - szStart;


// CString text(szStart, nLength);


// //text是各个拆开后的字符串,可以打印出来


// }





m_nPixels = (float)_tstof((const wchar_t*)m_szPixels.GetBuffer(0));


}


}


//print error message "szErr" here


//AfxMessageBox(szErr);


}



}





定义错误函数





CString CPageMeasument::REError2String(REParseError status)




{




switch (status) {




case REPARSE_ERROR_OK: return TEXT("No error occurred");




case REPARSE_ERROR_OUTOFMEMORY: return TEXT("Out of memory");




case REPARSE_ERROR_BRACE_EXPECTED: return TEXT("A closing brace was expected");




case REPARSE_ERROR_PAREN_EXPECTED: return TEXT("A closing parenthesis was expected");




case REPARSE_ERROR_BRACKET_EXPECTED: return TEXT("A closing bracket was expected");




case REPARSE_ERROR_UNEXPECTED: return TEXT("An unspecified fatal error occurred");




case REPARSE_ERROR_EMPTY_RANGE: return TEXT("A range expression was empty");




case REPARSE_ERROR_INVALID_GROUP: return TEXT("A back reference was made to a group that did not exist");




case REPARSE_ERROR_INVALID_RANGE: return TEXT("An invalid range was specified");




case REPARSE_ERROR_EMPTY_REPEATOP: return TEXT("A repeat operator (* or +) was applied to an expression that could
be empty");




case REPARSE_ERROR_INVALID_INPUT: return TEXT("The input string was invalid");




default: return TEXT("Unknown error");



}




}











{







UpdateData(TRUE);







if ((m_nPixels <= 0) && (BST_CHECKED==((CButton*)GetDlgItem(IDC_CHECK1))->GetCheck()))



{




CRect rect;




GetDlgItem(IDC_EDIT1)->GetWindowRect(&rect);




CPoint pt = rect.CenterPoint(); pt.x = rect.right-15;




m_tooltip.SetDirection(PPTOOLTIP_LEFTEDGE_TOP);




m_tooltip.ShowHelpTooltip(&pt, _T("<center><h2>Check input</h2><br><hr color=blue></center><br>You maybe enter a illegal values"));




return ;



}







if ((m_cboUnits.GetCurSel() < 0) && (BST_CHECKED==((CButton*)GetDlgItem(IDC_CHECK1))->GetCheck()) )



{



CRect rect;



GetDlgItem(IDC_COMBO_UNITS)->GetWindowRect(&rect);



CPoint pt = rect.CenterPoint(); pt.x = rect.right-15;



m_tooltip.SetDirection(PPTOOLTIP_LEFTEDGE_TOP);



m_tooltip.ShowHelpTooltip(&pt, _T("<center><h2>Check input</h2><br><hr color=blue></center><br>Select a units"));



return ;



}







CPropertyPage::OnOK();




}




四、说明


^{[-+]?\\d+}{\\.}?{\\d*}{[eE][-+]?\\d+}?$ ,本来语法是   ^([-+]?\d+)(\.)?(\d*)([eE][-+]?\d+)?$


()改成 {}才行,列外C++代码里面 \要用转义字符  \\ 表示,所以 \d 写成 \\d




^{[-+]?\\d+}{\\.}?{\\d*}{[eE][-+]?\\d+}?$"   表示是Unicode字符串,前面加个L 修饰



这个正则表达式表示的浮点数可以是:


-.2   -0.2   +0  +0.   +.2   1.23    -1.23   +1.23e-3    +1.23E+3  -1.23e-5   123  123.     123.e-3


等等各种合法浮点数。。



列外在这个网站​​http://regexlib.com/​​ 可以搜到很多现成的一些正则表达式。。。。。。。。。




五、结果,检测非法输入

使用CAtlRegExp正则表达式检查浮点数输入_float

 


使用CAtlRegExp正则表达式检查浮点数输入_正则表达式_02

 


 

标签:case,return,正则表达式,TEXT,浮点数,REPARSE,-+,ERROR,CAtlRegExp
From: https://blog.51cto.com/u_15911341/5935035

相关文章

  • 【正则】正则表达式 自用
      JAVA的用法获取之间的字符串publicstaticvoidmain(String[]args){Stringrex="(?<=需支付:).*?(?=元)";Stringstr="您好,您需支付:250元";......
  • 正则表达式(RegExp)Note
    //RegExpvarstr=prompt()//varreg=newRegExp('a')//字面量创建正则:字面量定义正则的话两条斜线之间的任意字符都是有含义的,都会纳入到正则......
  • python 正则表达式匹配
    在python中使用正则表达式以下几个步骤,1.用importre导入正则表达式模块2.用re.compile()函数创建一个Regex对象(记得使用原始字符串)3.向Regex对象的Search()方法传入想查找......
  • 正则表达式
    前段时间人力姐姐遇到了难题,老板要求统计本月加班情况,要从飞书到处的文档中统计出每个人加班的天数和加班日期(每晚9:00之后算是加班,公司补贴30元),人工统计工作量很大,因此问我......
  • Day37:正则表达式详解
    正则表达式1.1概述正则表达式可以用一些规定的字符来制定规则,并用来校验数据格式的合法性。比如我们在网站上输入用户账号,要求我们输入的账号信息要符合账号的格式,而校......
  • 前端开发系列034-基础篇之RegExp正则表达式
    title:'前端开发系列034-基础篇之RegExp正则表达式'tags:-javaScript系列categories:[]date:2017-09-1720:20:13本文介绍RegExp相关的知识点,包括正则表达式的......
  • Python正则表达式
    Python正则表达式情况:在一个EXCEL文件中,记录了众多公司的账目,单位有万元和亿元,彼此混杂。现想把单位统一为万元,且不显示出来法一:利用EXCEL的公式=IF(VALUE(MID(B2,1,......
  • 16. 正则表达式.md
    正则表达式定义:正则表达式用于定义一些字符串的规则作用:计算机可以根据正则表达式,来检查一个字符串是否符合指定的规则:或者将字符串中符合规则的内容提取出来创建正则表......
  • C++ Primer学习笔记 - 第17章 标准库特殊设施(正则表达式)
    目录17.3正则表达式17.3.1使用正则表达式17.3.2匹配与Regex迭代器类型17.3.3使用子表达式17.3.4使用regex_replace17.3正则表达式正则表达式(regularexpression)是......
  • nginx中的正则表达式,location路径匹配规则和优先级
    前言,我这里验证的nginx-v1.23.2单机环境下的nginx中的正则表达式、location路径匹配规则和优先级。先准备好环境,基础配置是这样nginx/conf/conf.d/host.conf:server{......