使用CAtlRegExp正则表达式检查浮点数输入
生活随笔
收集整理的這篇文章主要介紹了
使用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 ? ??????????? ? ? ? ?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/?可以搜到很多現成的一些正則表達式。。。。。。。。。
五、結果,檢測非法輸入 ?
二、下載后解壓,如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正则表达式检查浮点数输入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软 100 亿美元押注 OpenAI,
- 下一篇: 怎么避免UpdateData()函数弹出