WEB 开发 开发语言 Java 技术 .Net 技术 数 据 库 硬件使用
图象媒体 Linux/Unix 移动平台 嵌入开发 Windows 专区 软件工程
Ajax 技术 | ASP | PHP | ASP.NET | C# | JSP | Access | Oracle | 网页设计 | Flash | 安全专题 | IIS | VC/MFC | Delphi | C/C++
 你的位置:首页 > .Net 技术 > C#

英文字符串截取问题
[ 来源: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();//已经成功分离了
}
//原算法的错误出在结束的位置,它会少分割一个单词



我的算法不好吗,晕,怎么这么少分

 相关文章
·vs2005里的statusStrip1怎么往里面加个panel ?
·有实现这样的功能的Sql语句吗
·服务器是2003系统,原本装了.NET2.0 BETA版,但无法运行.NET2.0的WEB程序.然后卸载了2.0BETA版,装了.NET2.0正式简体中文版,出
·初学C#碰到的问题
·请问VB中的mid 方法 C# 是哪个?
·关于连接Oracle的奇怪问题

 推荐文章
接口的编程,哪位有相关的资料呢?
学习.Net的三个问题,请高手指点:Type与元数据,RTTI,垃圾回收
关于Panel和窗体和问题
关于Socket简单问题
关于连接Oracle的奇怪问题
如何在没安装。net。NET Framework的电脑上运行我的程序呢?
datetimepicker的奇怪问题
怎样做一个Windows Form服务来实现一些功能?
求关于触及bttn之后可以使另一个页面自动更新?
汉字之间加空格
如何判断 一个字符串可以转化为BOOL型
winForm的Icon问题
 版权所有:IT问库
copyright © 2006 www.itwenku.cn all rights reserved.