| 英文字符串截取问题 |
| [ 来源:ITWENKU 时间:2006-9-20 17:27:37 | 浏览:194人次
] |
| |
|
需求:有一个随机字符串例如:No.96 HongXing East Road Jining Shandong China.共47的字符,也可能是100或更多个字符组成的字符串。需要将这个字符串截取成最大值为30的字符数组,但要求单词不能被截断!!! 效果应该如下: 字符串1:No.96 HongXing East Road 字符串2:Jining Shandong China.
这个问题想的好久,我也没想出一个好的办法,恳求高手帮助一下,谢谢,在线等!!!
我理解的原理:找到第一个空格,记录空格之前的字符stringA及长度la,截取空格后的字符串为新字符串stringB;在stringB中找第一个空格,记录空格之前的字符stringC及长度lb,截取空格后的字符串为新字符串stringB,判断la+lb是否大于30。如果la+lb>30,则将la填充到数组中,stringA=stringC,la=lb,然后再stringB继续找下一个空格再判断;如果la+lb<30,stringA=stringC+stringA,la=lb+la,然后再stringB继续找下一个空格再判断。 大致应该是这样,至于代码感觉还是楼主自己写好一些。 不过有个问题,如果出现连在一起超过30个字符的,怎么办?呵呵
string text = "No.96 HongXing East Road Jining Shandong China"; string[] strs = text.split(' ');
哦,Sorry
没看完你的需求就回答了。
对于你这样的需求,比较好的方案就是,建立国家和地区的列表,所有在里面的都是字符串2,其他就是字符串1。
to:楼上的兄台 我的字符串是随机的,并不是专门为地区写的,也可能是其它的什么字符串 不过,还是谢谢你
cctaiyang(小刀可乐)的方法倒是可行 晚上写写看看 看看能不能写出一个好的函数来 谢谢小刀可乐!!!
给你一段代码吧,已经通过测试了 static void Main(string[] args) { string s = "No.96 HongXing East Road Jining Shandong China"; List<string> ls = new List<string>(); for (int i = 0; i < s.LastIndexOf(" ")+1;) { int count = 0,index = i; for (int j = i; count <=30 && j < s.Length; j++) { if (s[j] == ' ') index = j;//小于30的最后一个空格 count++; } if(index < s.Length) ls.Add(s.Substring(i,(index-i)+1));//(index-i)+1是子字符串的长度 i = index+1; } ls.ToArray();//已经成功分离了 }
判断一下字符串的长度,如果大于30,则先截取前30个字符,然后对前30个字符的最后一个" "空格进行index()一下,即读取它的位置i,然后根据位置i来截取第一个字符串。
然后再对剩下的字符串进行同样方式截取字符串。(同样需要先判断一下剩下字符串的个数是否大于30)
依次,知道剩下的字符串个数不大于30位置。
如果不大于30,则直接赋值,不需要截取。
结合 Santos(快乐的GG) 和 cctaiyang(小刀可乐) 的方法就行了
帮楼主顶
using System; using System.Collections.Generic; using System.Text;
namespace ConsoleApplication1 { class Program {
private static int stringLeng = 30;
static void Main(string[] args) { string a = "No.96 HongXing East Road Jining Shandong China.";
List<string> list = new List<string>(); NewMethod1(a, list);
foreach (string s in list) { System.Console.WriteLine(s+" length:"+s.Length.ToString() ); }
Console.ReadLine();
}
private static string NewMethod1(string a, List<string> list) { string l; string b;
while (a.Length > 0) {
if (a.Length >= stringLeng+1) { b = a.Substring(0, stringLeng+1); l = NewMethod(b, list); a = l + a.Substring(stringLeng+1); } else { list.Add(a); a = string.Empty;
}
} return a; }
private static string NewMethod(string b, List<string> list) { string l=string.Empty; for (int i = stringLeng; i > 0; i--) { char c = b[i]; if (c ==' ') { list.Add(b.Substring(0, i )); l = b.Substring(i+1); break; } } return l; } } }
private void getvalue(string s) { string temp=""; string tempf=""; string tempb=""; string tempk=""; if (s.Length>30) {temp=s.Substring(0,30); tempf=s.Substring(29,1); tempb=s.Substring(30,1); if((tempf=="")||(tempb=="")) { arr.Add(temp); s=s.Substring(31); } else { tempk=s.Substring(0,temp.LastIndexOf(" ")); s=s.Substring(tempk.Length+1); arr.Add(tempk); } getvalue(s); } else { arr.Add(s); } }
递归之
我的程序大体上是对的,就是稍微有点小毛病, 看到这么多人回复,就先不改了, 期待更好的方案出现……
可以每次直接取30,剔掉最后的不完整字,剩下的就是完整字了 判断第31的一个字符是不是分割符就行了,不是向前截断
循环做,知道最后的字符数小于30为止
严重同意递归
万一单词就超过30 lz如何解决啊??
引用 : 快乐小刀
我理解的原理:找到第一个空格,记录空格之前的字符stringA及长度la,截取空格后的字符串为新字符串stringB;在stringB中找第一个空格,记录空格之前的字符stringC及长度lb,截取空格后的字符串为新字符串stringB,判断la+lb是否大于30。如果la+lb>30,则将la填充到数组中,stringA=stringC,la=lb,然后再stringB继续找下一个空格再判断;如果la+lb<30,stringA=stringC+stringA,la=lb+la,然后再stringB继续找下一个空格再判断。 大致应该是这样,至于代码感觉还是楼主自己写好一些。 不过有个问题,如果出现连在一起超过30个字符的,怎么办?呵呵
思路一样.
看来大家都只习惯看文字啊
支持
to:fd7893(看着办吧) 你的方法只要在整个字符串后加一个空格即可
不好意思,昨天请假了,没来看帖子 今天看到这么多网友回帖 真的很高兴 谢谢大家了
建议如下:(循环次序少) 判断一下字符串的长度,如果大于30,则先截取前30个字符,然后对前30个字符的最后一个" "空格进行index()一下,即读取它的位置i,然后根据位置i来截取第一个字符串。
然后再对剩下的字符串进行同样方式截取字符串。(同样需要先判断一下剩下字符串的个数是否大于30)
依次,知道剩下的字符串个数不大于30位置。
如果不大于30,则直接赋值,不需要截取。
//这个是对的,稍作了一下修改 static void Main(string[] args) { string s = "No.96 HongXing East Road Jining Shandong China "; List<string> ls = new List<string>(); for (int i = 0; i < s.Length; ) { int j=0; int index = 0; for (; j < 30 && i+j < s.Length; j++) { if (s[i+j] == ' ') index = i+j;//小于30的最后一个空格 } if (j + i > index && j + i < s.Length) { ls.Add(s.Substring(i, (index - i) + 1)); i = index + 1;
} else { ls.Add(s.Substring(i, j)); i = j+i; } } string[] newStr = ls.ToArray();//已经成功分离了 } //原算法的错误出在结束的位置,它会少分割一个单词
我的算法不好吗,晕,怎么这么少分
|
|
 |
推荐文章 |
|