[\u0391-\uFFE5]匹配双字节字符(汉字+符号)
[\u4e00-\u9fa5]注意只匹配汉字,不匹配双字节字符
代码
///<summary>
///截取指定长度的字符串(Unicode占两位)
///</summary>
///<paramname="source">指定字符串</param>
///<paramname="length">指定长度</param>
///<returns>返回指定字符串长度的</returns>
publicstaticstringSub(stringsource,intlength)
{
stringtemp=source;
if(Regex.Replace(temp,"[\u0391-\uffe5]","",RegexOptions.IgnoreCase).Length<=length)
{
returntemp;
}
for(inti=temp.Length;i>=0;i--)
{
temp=temp.Substring(0,i);
if(Regex.Replace(temp,"[\u0391-\uffe5]","",RegexOptions.IgnoreCase).Length<=length)
{
returntemp+"";
}
}
return"";
}
上面这种执行效率比下面这种方法要高,耗时要短:
代码 ///<summary>
///截取指定长度的字符串(Unicode占两位)
///</summary>
///<paramname="source">指定字符串</param>
///<paramname="length">指定长度</param>
///<returns>返回指定字符串长度的</returns>
publicstaticstringSLeft(stringsource,intlength)
{
Regexregex=newRegex("[\u0391-\uffe5]+",piled);
char[]stringChar=source.ToCharArray();
stringsb="";
intnLength=0;
for(inti=0;i<stringChar.Length;i++)
{
if(nLength>=length)
{
break;
}
if(regex.IsMatch((stringChar[i]).ToString()))
{
sb+=stringChar[i];
nLength+=2;
}
else
{
sb+=stringChar[i];
nLength=nLength+1;
}
}
returnsb.ToString();
}
下面这种方法耗时最短,效率最高:
代码 publicstaticstringGetStr(stringsource,intlength)
{
intcount=0;
for(inti=0;i<source.Length;i++)
{
if(((int)source[i]).ToString("X2").Length==4)
count+=2;
else
count+=1;
}
if(count>length)
{
StringBuildersb=newStringBuilder();
count=0;
for(inti=0;i<source.Length;i++)
{
chartemp=source[i];
if(((int)temp).ToString("X2").Length==4)
{
count+=2;
}
else
{
count+=1;
}
if(count<length)
{
sb.Append(temp);
}
elseif(count==length)
{
sb.Append(temp);
break;
}
elseif(count>length)
{
sb.Append("");
break;
}
}
returnsb.ToString();
}
else
{
returnsource;
}
}
测试代码如下:
代码 stringsource="《中国》按时打发按时打发撒地方啊飒飒asdfasdfasd的法师打发似的<发(生的发生)地方按时打发是asdfasdfas";
intlength=10;
DateTimedt=DateTime.Now;
for(inti=0;i<1000;i++)
{
stringtemp=StrFun.SLeft(source,length);
}
TimeSpants=DateTime.Now-dt;
Console.WriteLine(ts.TotalMilliseconds);
dt=DateTime.Now;
for(inti=0;i<1000;i++)
{
stringtemp=StrFun.Sub(source,length);
}
ts=DateTime.Now-dt;
Console.WriteLine(ts.TotalMilliseconds);
dt=DateTime.Now;
for(inti=0;i<1000;i++)
{
stringtemp=StrFun.GetStr(source,length);
}
ts=DateTime.Now-dt;
Console.WriteLine(ts.TotalMilliseconds);
Console.Read();
结果为:
2328.125
1515.625
15.625