|
获取公里标内容,公里标格式为(ZDK123+224.21,公里标标识、千米标、百米标),获取其标识和数值。提取正则为:^([a-zA-Z]+)(\d+)\+(\d+(\.[0-9]{1,2}))$。
主要思路是:
$1 = ZDK
$2 = 123
$3 = 224.21
标识 = $1
数值 = $2 + $3
代码示例如下:
截取函数如下:
/************************************************************************/
/*-------------------------getKmTypeAndValue------------------------------------------*/
/*****日期:2022-07-05**************************************************/
/*****作者:zhaoanan****************************************************/
/*****函数功能:公里标截取函数******************************************/
/*****输入参数:********************************************************/
/**********1.km-输入公里标**********************************/
/**********2.kmType-返回公里标类型**********************************/
/**********3.kmValue-返回公里标值**********************************/
/*****输出参数:void**********************************************************************/
/*****返回值: 无*******************************************************************/
/************************************************************************/
void AttributeUtil::getKmTypeAndValue(CString km, CString &kmType, double &kmValue)
{
try
{
km.Replace(_T(" "), _T(""));
//将里程进行截取,里程名称+里程数值,其中数值部分为千里标和百里标之和
CString strReg = _T("^([a-zA-Z]+)(\\d+)\\+(\\d+(\\.[0-9]{1,2}))$") ;
//如果符合格式要求,则进行截取
if (CBlkUtility::IsStrMatch(strReg, km))
{
CString strPart1 = _T("") , strPart2 = _T(""), strPart3 = _T("") ;
CBlkUtility::RegReplace(strReg, _T("$1"), km, strPart1) ;
CBlkUtility::RegReplace(strReg, _T("$2"), km, strPart2) ;
CBlkUtility::RegReplace(strReg, _T("$3"), km, strPart3) ;
kmValue = _tstol(strPart2)*1000+_tstol(strPart3) ;
kmType = strPart1;
}
//如果不符合格式要求,则返回空值
else
{
kmType = _T("");
kmValue = 0.0;
}
}
catch (CMemoryException* e)
{
AfxMessageBox(_T("CMemoryException in getKmTypeAndValue")) ;
}
catch (CFileException* e)
{
AfxMessageBox(_T("CFileException in getKmTypeAndValue")) ;
}
catch (CException* e)
{
AfxMessageBox(_T("CException in getKmTypeAndValue")) ;
}
catch (_com_error& e)
{
CString sBuff = CBlkUtility::GetErrorDescription(e) ;
AfxMessageBox(sBuff) ;
}
catch (...)
{
AfxMessageBox(_T("unknown CException in getKmTypeAndValue")) ;
}
}
正则匹配函数如下:
BOOL CBlkUtility::IsStrMatch(const CString strReg, const CString strToCheck)
{
BOOL bRet = FALSE ;
match_results results;
//std::string strToCheck("");
//std::string strReg("");
_tstring sreg = (LPCTSTR)strReg ;
_tstring stocheck = (LPCTSTR)strToCheck ;
// TCHAR chToCheck[128] ;
// _tcscpy_s(chToCheck, strToCheck) ;
// //strToCheck = chToCheck ;
//
// TCHAR chReg[128] ;
// _tcscpy_s(chReg, strReg) ;
// //strReg = chReg ;
rpattern pat(sreg);
// Match a dollar sign followed by one or more digits,
// optionally followed by a period and two more digits.
// The double-escapes are necessary to satisfy the compiler.
match_results::backref_type br = pat.match( stocheck, results );
if( br.matched )
{
bRet = TRUE ;
}
return bRet ;
}
正则替换函数如下:
int CBlkUtility::RegReplace(const CString strReg, const CString strSub, const CString strSrc, CString &strResult)
{
REGEX_FLAGS dw = GLOBAL | ALLBACKREFS;
// if( m_bCase ) dw |= NOCASE;
// if( m_bMulti ) dw |= MULTILINE;
// if( m_bSingle ) dw |= SINGLELINE;
// double tmS = clock();
//
rpattern pat((LPCTSTR)strReg, (LPCTSTR)strSub, dw);
subst_results subResult;
_tstring str((LPCTSTR)strSrc);
int nCount = pat.substitute(str, subResult);
strResult = str.c_str();
return 0 ;
} |
|