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#截取字符串的操作有所帮助。
正在阅读:
C高性能的截取字符串函数05-16
四年级数学确定位置课后训练题08-10
革命历史题材小说发展09-19
内蒙古包头市达茂旗百灵庙第二中学2012--2013七年级第一学期生物期末试卷08-25
计算机二级MSoffice高级应用选择题大全(2017年最新版)06-10
评语模板02-24
多媒体年终工作总结范例04-10
基因组提取 16S RNA PCR及连接转化 - 图文03-15
明白纸之二(高级教师、一级教师、中专讲师填表说明)02-26
云南实习报告12-21
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 截取
- 字符串
- 高性能
- 函数
- 幼儿园春季入园温馨提示(家长必看)
- 散件猪肉验收标准
- 儿童肺炎支原体相关性肾炎临床特征研究
- 09年7月份电大高等数学基础考试试卷
- 道德讲堂活动推荐书目、歌曲等
- 宜宾县教育科研工作调研报告_调研报告.doc
- 人教版四年级下册语文第七单元试卷
- LED光电公司销售管理手册
- 研究生查阅资料的网站
- 细胞遗传学复习资料
- NBA 2k13手柄操作指南
- 2015届高考英语一轮总复习 Unit 1 Getting along with others活页练习(含解析)牛津译林版必修5
- 二年级品德《我来学做家务活》教学设计
- 常用电气设备控制与检修桥式起重机3
- 冬阳童年骆驼队说课稿
- 实验十四 薄荷油β-环糊精包合物的制备和检查
- 高原小组开发与经营旅游地产调研
- 七年级(上)科学第三章知识点(默写)
- 浅析贫困大学生心理健康问题及对策
- 浙江省《会计基础》历年真题06年-09年