c++ boost 汉字和模式串混用的例子
*===============================================================
* Copyright (C) All rights reserved.
*
* 文件名称:StringProcess.cpp
* 创 建 者:
* 创建日期:2013年04月24日
* 描 述:
* 备 注:
* 更新日志:
*
================================================================*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <sys/time.h>
#include<ctype.h>
#include<locale.h>
#include "boost/regex.hpp"
#include <iconv.h>
#include <errno.h>
#include<algorithm>
// please add your code here!
using namespace std;
#define MAX_LINE_LENGTH 1048576
#define TAGLEN 50
/************************************************************
* @brief <funcName:trim> Author:刘禹 finallyly 20130425 去掉字符串首尾空格
==================================================
* @param s
==================================================
**********************************************************/
void trim(char *s)
{
char *start;
char *end;
int len=strlen(s);
start=s;
end=s+len-;
while()
{
char c=*start;
if(!isspace(c))
{
break;
}
start++;
if(start>end)
{
s[]='\0';
return ;
}
}
while()
{
char c=*end;
if(!isspace(c))
{
break;
}
end --;
if(start>end)
{
s[]='\0';
return;
}
}
memmove(s,start,end-start+);
s[end-start+]='\0';
return;
} inline bool strTolower( char* str )
{
if ( !str )
return false;
int i = ;
bool flag = true;
while ( str[i] )
{
if ( 'A' <= str[i] && 'Z' >= str[i] )
{
str[i] += ;
}
else if ( 'a' <= str[i] && 'z' >= str[i] )
{
}
else
{
flag = false;
}
++i;
}
return flag;
} /************************************************************
* @brief <funcName:> Author:刘禹 finallyly
* 从系统默认的汉字编码本机是GBK转unicode,宽字符保存
==================================================
* @param sToMatch
==================================================
* @return
**********************************************************/
wstring String2Wstring(string sToMatch)
{
wstring wsToMatch;
setlocale( LC_CTYPE, "" ); // 很重要,没有这一句,转换会失败。
int iWLen = mbstowcs( NULL, sToMatch.c_str(), sToMatch.length() ); // 计算转换后宽字符串的长度。(不包含字符串结束符)
if(iWLen>)
{
wchar_t *lpwsz = new wchar_t[iWLen + ];
int i = mbstowcs( lpwsz, sToMatch.c_str(), sToMatch.length() ); // 转换。(转换后的字符串有结束符)
wsToMatch.assign(lpwsz);
delete []lpwsz;
}
else
{
wsToMatch=L"";
}
return wsToMatch;
}
/************************************************************
* @brief <funcName:> Author:刘禹 finallyly
* Unicode转系统自带编码,用于输出
==================================================
* @param sToMatch
==================================================
* @return
**********************************************************/
string Wstring2String(wstring sToMatch)
{
string sResult;
int iLen = wcstombs( NULL, sToMatch.c_str(), ); // 计算转换后字符串的长度。(不包含字符串结束符)
if(iLen>)
{
char *lpsz = new char[iLen + ];
int i = wcstombs( lpsz, sToMatch.c_str(), iLen ); // 转换。(没有结束符)
lpsz[iLen] = '\0';
sResult.assign(lpsz);
delete []lpsz;
}
else
{
sResult="";
}
return sResult;
}
/************************************************************
* @brief <funcName:> Author:刘禹 finallyly
* 从指定编码转换到目标编码
==================================================
* @param toCode
==================================================
* @param fromCode
==================================================
* @param srcstr
==================================================
* @param deststr
==================================================
* @param srclen
==================================================
* @param destlen
==================================================
* @return
**********************************************************/
int toAnotherCode(const char *toCode,const char *fromCode,char *srcstr, char *deststr, size_t srclen,size_t &destlen)
{
iconv_t convertor=iconv_open(toCode,fromCode);
size_t inputsize;
size_t outputsize;
size_t oldoutputsize;
char *input, *inputold;
char *output=NULL;
char *outputold=NULL;
int flag=;
if(convertor==iconv_t(-))
{
fprintf(stderr,"convertor device initailization failed!\n");
return ;
}
else
{
inputsize=srclen;
input=new char[inputsize+];
memcpy(input,srcstr,inputsize);
input[inputsize]='\0';
inputold=input;
outputsize=inputsize*;
oldoutputsize=outputsize;
output=new char[outputsize];
output[]=;
outputold=output;
size_t rc = iconv(convertor,&input,&inputsize,&output,&outputsize);
memcpy(deststr,outputold,oldoutputsize-outputsize);
deststr[destlen]=;
destlen=oldoutputsize-outputsize;
if(rc>)
{
flag=;
} delete []inputold;
delete []outputold; }
iconv_close(convertor);
if(flag==)
{
return ;
}
else
{
return ;
} }
/************************************************************
* @brief <funcName:PrintUsage> Author:刘禹 finallyly 20130424
==================================================
**********************************************************/
void PrintUsage()
{
fprintf( stderr, "prog [IN]hzpylist_file [IN]input_file [OUT]output_file [OUT]errdmp_file\n" );
}
void testRegex()
{
string s="刘禹,刘德华,刘佳佳。。。王大虎。。。刘长春,xixi";
string t="刘[^刘]*?,";
wstring p=String2Wstring(t);
wstring ws=String2Wstring(s);
boost::wregex wreg(p,boost::regbase::icase|boost::regex::perl);
boost::wsmatch wm;
vector<string> results;
wstring::const_iterator it=ws.begin();
wstring::const_iterator end=ws.end();
while(boost::regex_search(it,end,wm,wreg))
{
wstring wtemp=wm[];
string temp=Wstring2String(wtemp);
results.push_back(temp);
it=wm[].second;
}
fprintf(stdout,"输出正则匹配结果\n");
for(vector<string>::iterator it=results.begin();it!=results.end();it++)
{
printf("%s\n",(*it).c_str());
}
}
int LoadFile(char* inputfile)
{
FILE *fin = NULL;
char line[] = {};
char word[] = {};
int len = ;
fin = fopen(inputfile, "r");
if (NULL == fin)
{
fprintf(stderr,"LoadAddress can not open inputfilename %s\n", inputfile);
return ;
} while(true)
{
fgets(line, , fin);
if (feof(fin))
{
break;
}
len = strlen(line);
if ( == line[] || '\n' != line[len - ])
{
continue;
}
line[len - ] = ;
string pattern ="首都或首府:";
string p1="([\u2E80-\u9FFF])+";
wstring wp1 = String2Wstring(p1);
//wstring wpattern = L"([\u2E80-\u9FFF])+";
wstring wpattern = L"([\u2E80-\u9FFF]+)"+String2Wstring(pattern)+L"([\u2E80-\u9FFF]+)";
wstring winputstr = String2Wstring(line);
boost::wregex wreg(wpattern, boost::regex::perl|boost::regbase::icase);
boost::smatch what;
boost::wsmatch wswhat;
wstring::const_iterator wstrit = winputstr.begin();
wstring::const_iterator wstrend = winputstr.end();
while (boost::regex_search(wstrit, wstrend, wswhat, wreg))
{
wstring ws1 = wswhat[];
wstring ws2 = wswhat[];
string s1 = Wstring2String(ws1);
string s2 = Wstring2String(ws2);
fprintf(stdout, "%s\t%s\n", s1.c_str(), s2.c_str());
wstrit=wswhat[].second;
}
} if (NULL != fin)
{
fclose(fin);
fin = NULL;
}
return ;
}
int main( int argc, char *argv[] )
{
timeval tv1, tv2;
gettimeofday(&tv1, NULL); if ( != argc )
{
PrintUsage();
return ;
} LoadFile(argv[]);
gettimeofday(&tv2, NULL);
fprintf(stderr,"%s has finished congratulations!\n",argv[]);
fprintf( stderr,"time elapsed: %.2f ms\n", (float)((tv2.tv_sec - tv1.tv_sec)*+(tv2.tv_usec-tv1.tv_usec))/);
return ;
}
c++ boost 汉字和模式串混用的例子的更多相关文章
- AC自动机 - 多模式串的匹配 --- HDU 3695 Computer Virus on Planet Pandora
Problem's Link Mean: 有n个模式串和一篇文章,统计有多少模式串在文章中出现(正反统计两次). analyse: 好久没写AC自动机了,回顾一下AC自动机的知识. 本题在构造文章的时 ...
- AC自动机 - 多模式串的匹配运用 --- HDU 3065
病毒侵袭持续中 Problem's Link:http://acm.hdu.edu.cn/showproblem.php?pid=3065 Mean: 略 analyse: AC自动机的运用. 这一题 ...
- 找模式串[XDU1032]
Problem 1032 - 找模式串 Time Limit: 1000MS Memory Limit: 65536KB Difficulty: Total Submit: 644 Acce ...
- POJ-3461 Oulipo(KMP,模式串在主串中出现次数)
题意:给你两个字符串p和s,求出p在s中出现的次数. 显然,我们要先把模式串放到前面,之后主串放后面,中间隔开,这样就可以根据前缀数组的性质来求了. 我先想直接把p接到s前面,之后求Next数组对st ...
- 【基本算法】 KMP文本串模式串的字符串匹配算法
看了两个晚上的KMP,加上基本的“暴力匹配” 今晚看懂next[j]递归求解时,突然觉得算法真的好美妙,虽然觉悟的晚但晚胜过没有是吧! 我的博客都是应试性的学习笔记,不具备指导性,还是大神们写的好,例 ...
- HDU 1686 (KMP模式串出现的次数) Oulipo
题意: 求模式串W在母串T中出现的次数,各个匹配串中允许有重叠的部分. 分析: 一开始想不清楚当一次匹配完成时该怎么办,我还SB地让i回溯到某个位置上去. 后来仔细想想,完全不用,直接让模式串向前滑动 ...
- HDU 2087 剪花布条(模式串在主串中出现的次数主串中子串不可重叠)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087 题意:求模式串在主串中出现的次数,与模式串匹配的子串之间不可重叠. 思路:用kmp算法解决,在匹 ...
- POJ 3167 Cow Patterns(模式串浮动匹配)
题目链接:http://poj.org/problem?id=3167 题意:模式串可以浮动的模式匹配问题给出模式串的相对大小,需要找出模式串匹配次数和位置. 思路:统计比当前数小,和于当前数相等的, ...
- 问题 1690: 算法4-7:KMP算法中的模式串移动数组
题目链接:https://www.dotcpp.com/oj/problem1690.html 题目描述 字符串的子串定位称为模式匹配,模式匹配可以有多种方法.简单的算法可以使用两重嵌套循环,时间复杂 ...
随机推荐
- ZOJ-2342 Roads 二分图最小权值覆盖
题意:给定N个点,M条边,M >= N-1.已知M条边都有一个权值,已知前N-1边能构成一颗N个节点生成树,现问通过修改这些边的权值使得最小生成树为前N条边的最小改动总和为多少? 分析:由于计算 ...
- iOS - AVPlayer 音视频播放
前言 NS_CLASS_AVAILABLE(10_7, 4_0) @interface AVPlayer : NSObject @available(iOS 4.0, *) public class ...
- iOS - ImageCache 网络图片缓存
1.ImageCache 使用内存缓存方式: 使用沙盒缓存方式: 使用网络图片第三方库方式: SDWebImage: iOS 中著名的网络图片处理框架 包含的功能:图片下载.图片缓存.下载进度监听.g ...
- 1503 - A PRIMARY KEY must include all columns in the table's partitioning function
1503 - A PRIMARY KEY must include all columns in the table's partitioning function 错误的原因:表的主键字段必须包含分 ...
- Java中的AWT进阶
围棋 package ch11; /** * Created by Jiqing on 2016/12/4. */ import java.awt.*; import javax.swing.*; i ...
- uva 11324 The Largest Clique
vjudge 上题目链接:uva 11324 scc + dp,根据大白书上的思路:" 同一个强连通分量中的点要么都选,要么不选.把强连通分量收缩点后得到SCC图,让每个SCC结点的权等于它 ...
- hdu 5339 Untitled
这题很明显是签到题,可我比赛时却没做出,赤裸裸的爆零了,真悲剧…… 看了题解后才知道直接暴搜就行,只是需要把它们从大到小排序后再搜,我当时就没想到...不想再多说了 一开始我直接枚举所有情况: #in ...
- java.lang.UnsupportedClassVersionError: org/sonatype/nexus/bootstrap/jsw/JswLauncher : Unsupported major.minor version 51.0
jdk 版本不对,需要修改jdk的版本
- 【CDN】域名无法访问,ping不到,tracert不到
背景:香港服务器,CDN服务商:Incapsula 1.首先猜测,域名是否被墙 原因:ip可以直接访问到网站,其他域名指向服务器也可访问 排查:1)首先理解,怎样才算被墙:大陆外可以通过该域名访问,大 ...
- 工作了3年的JAVA程序员应该具备什么技能?(zhuan)
http://www.500d.me/article/5441.html **************************************** 来源:五百丁 作者:LZ2016-03-18 ...