一、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
                     szErr += REError2String(status);
        } 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()函数(它会调用DoDataExchange)

void CPageMeasument::OnOK()

{
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+)?$
使用CAtlRegExp类需要将()改成{}才行,列外C++代码里面\要用转义字符 \\ 表示,所以\d 写成\\d
L"^{[-+]?\\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/ 可以搜到很多现成的一些正则表达式。。。。。。。。。
五、结果,检测非法输入

六、为什么要正则表达式来检测输入的字符串,而不直接给Edit定义一个float变量,因为第一为了美观,UpdataDate()时如果输入非法会弹出一些很丑的对话框,而且输入也不怎么好。。。。

使用CAtlRegExp正则表达式检查浮点数输入相关推荐

  1. [正则表达式]文本框输入内容控制

    整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$ 只能输入数字:"^[0-9]*$". 只能输入n位的数字:"^\d{n}$". 只能输入至少n ...

  2. C++ Primer 5th笔记(chap 17 标准库特殊设施)正则表达式类和输入序列类型

    1. 多种类型的输入 可以搜索多种类型的输入序列. RE 库为这些不同的输入序列类型都定义了对应的类型,eg. 普通 char 数据.wchar_t 数据 字符可以保存在标准库string或是 cha ...

  3. c语言怎么循环输入单个字符,c语言 帮我检查一下 输入一段文字,每行用回车结束,文字输入完毕可以使用某个特殊字符作为结束,...

    c语言 帮我检查一下 输入一段文字,每行用回车结束,文字输入完毕可以使用某个特殊字符作为结束,0 HIDE152019.04.28浏览4次分享举报 c语言输入一段文字,每行用回车结束,文字输入完毕可以 ...

  4. Python使用正则表达式检查合法IP地址

    全国高校教师Python课程高级研修班(线上,11月20-21日) 中国大学MOOC"Python程序设计基础"第5次开课 推荐图书: <Python可以这样学>,IS ...

  5. Excel用正则表达式提取出输入正确的身份证号

    今天小编帮助客户整理了一堆省份证号,如下图所示,这里为了做演示输入了一些虚拟号,想要分享的是Excel用正则表达式提取出输入正确的身份证号 (方方格子插件) 1.先看动图演示吧 2.那我了对比我们可以 ...

  6. 正则表达式匹配浮点数

    正则表达式匹配浮点数 s="23.002 0788 789 788 055 0 +0 -0 +234 -345 89.26 -8889 -0.36 +78.36 7888.3699" ...

  7. 正则表达式验证不能输入汉字

    正则表达式验证不能输入汉字 <el-col :span="12"><el-form-item label="乡镇编码" prop=" ...

  8. el-input中,输入input和失去焦点blur时进行校验——正则表达式之只能输入数字和大写字母 只能输入数字 颜色值的正则表达式-3位和6位 标签的回车事件

    el-input中,输入input和失去焦点blur时进行校验--正则表达式之只能输入数字和大写字母 & 只能输入数字 & 颜色值的正则表达式-3位和6位 & 标签的回车事件 ...

  9. python 正则表达式匹配数字或者小数点_用正则表达式匹配浮点数

    在这个例子中,我将向你展示如何避免不熟悉正则表达式的人常犯的一些错误.我们将尝试建立一个可以匹配浮点数的正则表达式.我们的正则表达式也应该匹配整数,以及整数部分(即0)没有给出来的浮点数. 乍看之下, ...

最新文章

  1. iOS和OS X中的bundle
  2. openmp官方源码_MNN推理过程源码分析笔记(一)主流程
  3. linux sed错误sed: -e expression #1, unknown option to `s'解决办法
  4. Linux dn命令大全,linux命令大全完整版.doc
  5. 利用Lucene.net搜索引擎进行多条件搜索的做法
  6. html pc vw过大,细说em/rem/vh/vw与响应式布局
  7. java web mvc 拆分_JAVA WEB初接触——简单的MVC架构
  8. C# params的用法详解
  9. 程序员自家种水果,新鲜包邮配送
  10. 前端学习(1993)vue之电商管理系统电商系统之根据id删除数据
  11. java有关问题,java经典有关问题!
  12. 昨天习题答案大剖析!再接再厉
  13. mysql 按类型查询个数和总数
  14. Face3D学习笔记(4)3DMM示例源码解析【中上】3DMM模型
  15. HDU-4565 So Easy!
  16. 关于 mysql数据库“ERROR 1118 (42000): Row size too large.“ 的解决方法
  17. 手机剪辑视频指南:去水印、加字幕、做转场,统统一键就搞定
  18. 最近发现一个不错的网站,可以用它来赚钱
  19. 95后国风艺术家联手AI,立志耗时一年,作百米长卷《新西湖繁胜全景图》献礼杭州亚运!...
  20. kubernetes 从入门到实践

热门文章

  1. RTL行为级仿真、综合后门级功能仿真和时序仿真
  2. windows和linux双系统引导问题
  3. 常见的网络工程师面试问题
  4. [转]ReiserFS与ext3的比较
  5. 利用逆矩阵解线性方程组_机器人学导论---第四章 操作臂逆运动学(一)4.1-4.11...
  6. r语言 断轴 画图_R语言作图——Density plot
  7. mysql shell 1.0.10_MySQL Shell(使用Shell命令管理MySQL)下载 v1.0.10 官方32位+64位Windows版 - 比克尔下载...
  8. 方钢管弹性模量计算方式_弹性模量的物理学本质
  9. 服务器备份文件格式,证书服务器,备份,还原
  10. linux赋权限命令chmod给其他用户,Linux 基础基础——权限管理命令chmod