截取指定长度的中英文混合字符串的最终算法

时间:2007/4/4 19:11:11      阅读:4404          
      由于工作需要,要写一个截取指定长度的函数,写一个又太懒,想或许到Google上能搜索到,但是可惜的是,搜索到的方法几乎都有问题,不单是效率,还有结果都不能正常显示,有的文章甚至被不少大网站互相转来转去,最近找到一个用C#截取指定长度的方法,觉得效率很不错,所以把它保留下来了,转成两个版本C#和VB。
      例如要截取字符串"我是1个中国人",取3位长度,那得到的结果是"我",如果取6位长度,得到的结果是"我是1",因为汉字是两个字节。
大家看代码:
VB:
Public Shared Function GetSubString(ByVal str As String, ByVal length As Integer) As String
Dim temp As String = str
Dim j As Integer = 0
Dim k As Integer = 0
Dim i As Integer
For i = 0 To temp.Length - 1 Step i + 1
If Regex.IsMatch(temp.Substring(i, 1), "[\u4e00-\u9fa5]+") Then
j
+= 2
Else
j
+= 1
End If
If j <= length Then
k
+= 1
End If
If j >= length Then
Return temp.Substring(0, k)
End If
Next
Return temp
End Function

C#:
public static string GetSubString(string str, int length)
{
string temp = str;
int j = 0;
int k = 0;
for (int i = 0; i < temp.Length; i++)
{
if (Regex.IsMatch(temp.Substring(i, 1), @"[\u4e00-\u9fa5]+"))
{
j
+= 2;
}

else
{
j
+= 1;
}

if (j <= length)
{
k
+= 1;
}

if (j >= length)
{
return temp.Substring(0, k);
}

}

return temp;
}


      具体思路是,定义两个变量:j 与K,例如要截取字符串"我是1个中国人",取3位长度,从第一个字符开始判断——temp.Substring(i, 1),如果是双字节j+2,否则加1,而变量K则每次循环加1,用来执行最后的截取操作。
当j <= 要截取的字节数,变量K停止加1。
当j >= 要截取的字节数,根据K返回截取后的结果。
      看到别人的方法,都是最先将整个字符串中的中文替换成双字节,然后判断总长度是否大于需要截取的长度,如果大于再执行截取,而这样无疑是低效的(如果需要截取的字符串有1万个字符,需要返回的是20个字符,同时返回20条记录的话需要替换几十万次....),还要接下来再判断是该截取几位.....
如果大家还有更加高效的方法,欢迎一起来讨论。
评论
  • Re:截取指定长度的中英文混合字符串的最终算法   (2007/5/11 10:49:31) by hy007 
    正想找呢
  • Re:截取指定长度的中英文混合字符串的最终算法   (2007/10/9 9:51:03) by 鏉庡嘲 
    写得挺好
  • Re:截取指定长度的中英文混合字符串的最终算法   (2009/3/13 14:29:16) by ylp1588 
    太好了,正好用上.
  • Re:截取指定长度的中英文混合字符串的最终算法   (2009/11/26 22:19:57) by y2222 

    v太好了,正好用上.

标 题:
 
姓 名:
 
主 页:

验证码:

评论:
 

Because of the cache,you may see your comments several minutes later.