天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 66|回复: 0

ObjectArxC++正则表达式数据提取

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
获取公里标内容,公里标格式为(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 ;
}

 

 

 

 

ObjectArxC++正则表达式数据提取
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 09:26 , Processed in 0.112086 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表