ICU正则表达式初试

学习了一下ICU下的正则表达式用法,随即编码一试,代码如下:
#include <iostream>
#include "unicode/utypes.h"
#include "unicode/ucnv.h"
#include "unicode/regex.h"
using namespace std;
int reg_exp_match(const char*pat, const char* sour);
#pragma comment(lib,"icuuc.lib")
#pragma comment(lib,"icuin.lib")
int main()
{
	/*int num = reg_exp_match("a[abc]c+[0-9]","abc6dfdacc6fdhaac8kjhdacc4s");*/
	const char* sour = "ab2013-04-26dfd6f2012-12-09dhaac8kj2016-05-12hdacc4s";
	/*int num = reg_exp_match("\^(\\d{4})-(\\d{2}-(\\d\\d))\$",sour);*/
	int num = reg_exp_match( "[0-9]{2,4}-[0-9]{1,2}-[0-9]{1,2}",sour);
	cout<<num<<endl;
	system("pause");
	return 0;
}
int  reg_exp_match(const char*pat, const char* sour)
{
	int num = 0;
	int LEN = strlen(sour);
	UConverter *cv = NULL;
	RegexPattern *REPattern = NULL;///正则表达式
	RegexMatcher *REMatcher = NULL;//匹配器
	UErrorCode status = U_ZERO_ERROR;
	UnicodeString patString(pat);
	//Unicode正则表达式组装,这些函数经常代替构造函数来创建RegexPattern对象
	REPattern = RegexPattern::compile(patString,0,status);
	if (U_FAILURE(status)) 
	{
		return 0;
	}
	//把母串转换为Unicode
	UnicodeString inputString(sour);
	//剔除字符串中的一些序列
	UnicodeString unEscapedInput = inputString.unescape();
	//创建一个正则表达式匹配器
	REMatcher = REPattern->matcher(unEscapedInput,status);
	if (U_FAILURE(status))
	{
		return 0;
	}
	
	//UnicodeString ss = REMatcher->input();//返回母串
	//UnicodeString ss = REMatcher->refreshInputText("123",status);
	//UnicodeString another = (UnicodeString)"abc5fdhaac2kjhdacc1h";
	//REMatcher->reset(another);
	

	用replaceStr替换母串中第一个的正则表达式字符串
	/*UnicodeString substring = REMatcher->replaceFirst(replaceStr,status);*/

	int32_t leng = inputString.length();
	char *result = new char[4*leng];
	memset(result,0,4*leng);
	cv = ucnv_open("GB18030",&status);
	ucnv_fromUChars(cv,result,4*leng,inputString.getBuffer(),leng,&status);
	ucnv_close(cv);
	int64_t pos = 0;
	LEN = strlen(result);
	printf("%s\n",result);
	UnicodeString dest[10];
	//该函数以模式串为分隔符将待处理的字符串分为几组存放到数组dest中
	int32_t gp = REMatcher->split(inputString,dest,10,status);

	//int64_t pos = 0;
	//int32_t count = 0;
	//if(REMatcher->find())
	//{
	//	//必须在find函数之后str才有值
	//	UnicodeString str = REMatcher->group(status);

	//}
	//groupCount函数根据正则表达式中的括号数目来计数的
	//count = REMatcher->groupCount();
	while(pos < LEN)
	{
		if(REMatcher->find(pos,status))
		{
			/*if(REMatcher->find())
			{*/
				//必须在find函数之后str才有值
				UnicodeString str = REMatcher->group(status);
				
			/*}*/
			num++;
			pos = REMatcher->end64(status);
		}
		else
		{
			break;
		}
	}
	//count = REMatcher->groupCount();

	return num;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值