C高性能的截取字符串函数

更新时间:2023-05-16 05:10:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

去年的时候由于工作需要,写了个用C#截取指定长度的方法,当时颇费了一番周折,因为想错了方向。

例如要截取字符串"我是1个中国人",取3位长度,那得到的结果是"我",如果取6位长度,得到的结果是"我是1",因为汉字是两个字节。

当时的思路主要是考虑最后一位是单字节还是双字节,不过最终得出了比较不错的方法,只是这方法后来却找不到了,重新写一个又太懒,想或许到Google上能搜索到,但是可惜的是,搜索到的方法几乎都有问题,不单是效率,还有结果都不能正常显示,有的文章甚至被不少大网站互相转来转去,呀,没有人调试过吗?

拿出时间来自己写一个,大家看代码:

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条记录的话需要替换几十万次....),还要接下来再判断是该截取几位.....

/**工作需要,要找一段截取定长混合的代码。*/

public static string GetSubString(string str, int length) {

string temp = str;

int j = 0, k=0;

CharEnumeratorce = str.GetEnumerator();

while (ce.MoveNext()) {

j += (ce.Current> 0 &&ce.Current< 255) ? 1 : 2 ;

if (j <= length) {

k++;

} else {

temp = str.Substring(0, k);

break;

}

}

return temp;

}

你这个有问题,只能判断中文,应该判断所有双字节字符

public static string GetStrLenAll(string s, intlen, string style)

{

string temp = s;

if (Regex.Replace(temp, "[^\x00-\xff]", "zz", RegexOptions.IgnoreCase).Length <= len)

{

return temp;

}

for (int i = temp.Length; i >= 0; i--)

{

temp = temp.Substring(0, i);

if (Regex.Replace(temp, "[^\x00-\xff]", "zz", RegexOptions.IgnoreCase).Length <= len - style.Length)

{

return temp + style;

}

}

return "";

}

C#截取字符串应用:用C#截取指定长度的中英文混合字符串

我们常做的一件事情,就是在文章系统中,截取一定长度的文章标题,超过指定长度,就加“...”

如两个字符串:

1. string str1 = "中国人要啊abc呀~";

2. string str2 = "1中国人23456abc呀~";

C#截取字符串程序输出:

1. str1 = "中国人要...";

2. str2 = "1中国人2...";

即要把中英文混合的字符串,在截取后,长度要一致,即8个字节的长度(不包括三个点),而且不能出现中文被从中间截断的情况。于是写了个方法:

1. public static string getStr(string s,int l)

2. {

3. string temp = s ;

4. if (Regex.Replace(temp,

5. "[\u4e00-\u9fa5]","zz",

6. RegexOptions.IgnoreCase).Length<=l)

7. {

8. return temp;

9. }

10. for (int i=temp.Length;i>=0;i--)

11. {

12. temp = temp.Substring(0,i);

13. if (Regex.Replace(temp,

14. "[\u4e00-\u9fa5]","zz",

15. RegexOptions.IgnoreCase).Length<=l-3)

16. {

17. return temp + "";

18. }

19. }

20. return "";

21. }

调用:

1. string content = "中国人啊abc呀呀呀呀";

2. content = getStr(content,13);

C#截取字符串的相关应用就向你介绍到这里,希望对你了解和学习C#截取字符串的操作有所帮助。

本文来源:https://www.bwwdw.com/article/rnc4.html

Top