一、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正则表达式检查浮点数输入相关推荐
- [正则表达式]文本框输入内容控制
整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$ 只能输入数字:"^[0-9]*$". 只能输入n位的数字:"^\d{n}$". 只能输入至少n ...
- C++ Primer 5th笔记(chap 17 标准库特殊设施)正则表达式类和输入序列类型
1. 多种类型的输入 可以搜索多种类型的输入序列. RE 库为这些不同的输入序列类型都定义了对应的类型,eg. 普通 char 数据.wchar_t 数据 字符可以保存在标准库string或是 cha ...
- c语言怎么循环输入单个字符,c语言 帮我检查一下 输入一段文字,每行用回车结束,文字输入完毕可以使用某个特殊字符作为结束,...
c语言 帮我检查一下 输入一段文字,每行用回车结束,文字输入完毕可以使用某个特殊字符作为结束,0 HIDE152019.04.28浏览4次分享举报 c语言输入一段文字,每行用回车结束,文字输入完毕可以 ...
- Python使用正则表达式检查合法IP地址
全国高校教师Python课程高级研修班(线上,11月20-21日) 中国大学MOOC"Python程序设计基础"第5次开课 推荐图书: <Python可以这样学>,IS ...
- Excel用正则表达式提取出输入正确的身份证号
今天小编帮助客户整理了一堆省份证号,如下图所示,这里为了做演示输入了一些虚拟号,想要分享的是Excel用正则表达式提取出输入正确的身份证号 (方方格子插件) 1.先看动图演示吧 2.那我了对比我们可以 ...
- 正则表达式匹配浮点数
正则表达式匹配浮点数 s="23.002 0788 789 788 055 0 +0 -0 +234 -345 89.26 -8889 -0.36 +78.36 7888.3699" ...
- 正则表达式验证不能输入汉字
正则表达式验证不能输入汉字 <el-col :span="12"><el-form-item label="乡镇编码" prop=" ...
- el-input中,输入input和失去焦点blur时进行校验——正则表达式之只能输入数字和大写字母 只能输入数字 颜色值的正则表达式-3位和6位 标签的回车事件
el-input中,输入input和失去焦点blur时进行校验--正则表达式之只能输入数字和大写字母 & 只能输入数字 & 颜色值的正则表达式-3位和6位 & 标签的回车事件 ...
- python 正则表达式匹配数字或者小数点_用正则表达式匹配浮点数
在这个例子中,我将向你展示如何避免不熟悉正则表达式的人常犯的一些错误.我们将尝试建立一个可以匹配浮点数的正则表达式.我们的正则表达式也应该匹配整数,以及整数部分(即0)没有给出来的浮点数. 乍看之下, ...
最新文章
- iOS和OS X中的bundle
- openmp官方源码_MNN推理过程源码分析笔记(一)主流程
- linux sed错误sed: -e expression #1, unknown option to `s'解决办法
- Linux dn命令大全,linux命令大全完整版.doc
- 利用Lucene.net搜索引擎进行多条件搜索的做法
- html pc vw过大,细说em/rem/vh/vw与响应式布局
- java web mvc 拆分_JAVA WEB初接触——简单的MVC架构
- C# params的用法详解
- 程序员自家种水果,新鲜包邮配送
- 前端学习(1993)vue之电商管理系统电商系统之根据id删除数据
- java有关问题,java经典有关问题!
- 昨天习题答案大剖析!再接再厉
- mysql 按类型查询个数和总数
- Face3D学习笔记(4)3DMM示例源码解析【中上】3DMM模型
- HDU-4565 So Easy!
- 关于 mysql数据库“ERROR 1118 (42000): Row size too large.“ 的解决方法
- 手机剪辑视频指南:去水印、加字幕、做转场,统统一键就搞定
- 最近发现一个不错的网站,可以用它来赚钱
- 95后国风艺术家联手AI,立志耗时一年,作百米长卷《新西湖繁胜全景图》献礼杭州亚运!...
- kubernetes 从入门到实践
热门文章
- RTL行为级仿真、综合后门级功能仿真和时序仿真
- windows和linux双系统引导问题
- 常见的网络工程师面试问题
- [转]ReiserFS与ext3的比较
- 利用逆矩阵解线性方程组_机器人学导论---第四章 操作臂逆运动学(一)4.1-4.11...
- r语言 断轴 画图_R语言作图——Density plot
- mysql shell 1.0.10_MySQL Shell(使用Shell命令管理MySQL)下载 v1.0.10 官方32位+64位Windows版 - 比克尔下载...
- 方钢管弹性模量计算方式_弹性模量的物理学本质
- 服务器备份文件格式,证书服务器,备份,还原
- linux赋权限命令chmod给其他用户,Linux 基础基础——权限管理命令chmod