将英文句子拆成一个个单词(对于句子中可能出现的不同情况)
2015-02-09 18:02
746 查看
最近有个需求,后台给我一个英文句子,我要把其中每个单词拆出来,然后计算出单词的个数,把每个单词布局到一个个横线上。 有的人会想,很好搞啊,直接以空格去拆分就得了,然后再判断每个单词的最后一个字符是不是逗号等符号,是的话去掉。
这样做的话,那得要求后台的英文句子高度标准,假如句子里有连续的两个空格怎么办,这个时候拆分出来的单词就会出现空格,单词数就会不准确。这个还好说,有解决方法:如果判断出单词是空格的话,去掉就好。可是另外一种情况,比如句子是 “Yeah,I need a word”。Yeah 和 I 之间只有逗号,没有空格,这个时候如果再去做判断就显得很麻烦。。更何况后台给出的问题情况多种多样,你懂的。。根本无法单纯的用以空格进行拆分的方法去解决这个问题。所以怎么解决呢? 对,逐个字符遍历的方法。 现列出两种方法,两种方法的思路是一样的。。
假如句子就是:
NSString *sentence =@"Yeah,...I need a world.";
方法一:
- (NSMutableArray *)componentsWithString:(NSString *)str
{
NSMutableArray *wordArray = [NSMutableArrayarray];
NSString *wordStr = @"";
for (int y =
0;y < str.length; y++) {
//利用截取字符串的方法截取出每个字符
NSString *string1 = [str
substringFromIndex:y];
NSString *string2 = [string1
substringToIndex:1];
//转化为字符的形式,此处编码方式可以是NSUTF8StringEncoding
constchar *s = [string2
cStringUsingEncoding:NSASCIIStringEncoding];
//判断是不是字母
//针对于上引号’这种情况:s[0]=='\''
//针对于有短横线 - 这种情况:s[0]=='-'
if ((s[0] >=65 && s[0]<=90) || (s[0]>=97 && s[0]<=122)
|| s[0]=='\'' || s[0]=='-') {
NSString *string = [NSStringstringWithCString:s
encoding:NSUTF8StringEncoding];
wordStr = [wordStr stringByAppendingString:string];
}else {
if (wordStr.length >0) {
[wordArray addObject:wordStr];
}
wordStr = @"";
}
}
return wordArray;
}
方法二:
- (NSMutableArray *)componentsWithString1:(NSString *)str
{
NSMutableArray *wordArray = [NSMutableArrayarray];
NSString *wordStr = @"";
for (int k=0; k<strlen(str.UTF8String); k++) {
if ((str.UTF8String[k] >=97 && str.UTF8String[k] <=
122)|| (str.UTF8String[k] >=
65 && str.UTF8String[k] <=97 || (str.UTF8String[k]=='\'') || (str.UTF8String[k]=='-' )) {
wordStr = [wordStr stringByAppendingFormat:@"%c",str.UTF8String[k]];
}else {
if (wordStr.length >0) {
[wordArray addObject:wordStr];
wordStr = @"";
}
}
}
return wordArray;
}
从以上可以看出,方法二较为简便,推荐用方法二。
这样做的话,那得要求后台的英文句子高度标准,假如句子里有连续的两个空格怎么办,这个时候拆分出来的单词就会出现空格,单词数就会不准确。这个还好说,有解决方法:如果判断出单词是空格的话,去掉就好。可是另外一种情况,比如句子是 “Yeah,I need a word”。Yeah 和 I 之间只有逗号,没有空格,这个时候如果再去做判断就显得很麻烦。。更何况后台给出的问题情况多种多样,你懂的。。根本无法单纯的用以空格进行拆分的方法去解决这个问题。所以怎么解决呢? 对,逐个字符遍历的方法。 现列出两种方法,两种方法的思路是一样的。。
假如句子就是:
NSString *sentence =@"Yeah,...I need a world.";
方法一:
- (NSMutableArray *)componentsWithString:(NSString *)str
{
NSMutableArray *wordArray = [NSMutableArrayarray];
NSString *wordStr = @"";
for (int y =
0;y < str.length; y++) {
//利用截取字符串的方法截取出每个字符
NSString *string1 = [str
substringFromIndex:y];
NSString *string2 = [string1
substringToIndex:1];
//转化为字符的形式,此处编码方式可以是NSUTF8StringEncoding
constchar *s = [string2
cStringUsingEncoding:NSASCIIStringEncoding];
//判断是不是字母
//针对于上引号’这种情况:s[0]=='\''
//针对于有短横线 - 这种情况:s[0]=='-'
if ((s[0] >=65 && s[0]<=90) || (s[0]>=97 && s[0]<=122)
|| s[0]=='\'' || s[0]=='-') {
NSString *string = [NSStringstringWithCString:s
encoding:NSUTF8StringEncoding];
wordStr = [wordStr stringByAppendingString:string];
}else {
if (wordStr.length >0) {
[wordArray addObject:wordStr];
}
wordStr = @"";
}
}
return wordArray;
}
方法二:
- (NSMutableArray *)componentsWithString1:(NSString *)str
{
NSMutableArray *wordArray = [NSMutableArrayarray];
NSString *wordStr = @"";
for (int k=0; k<strlen(str.UTF8String); k++) {
if ((str.UTF8String[k] >=97 && str.UTF8String[k] <=
122)|| (str.UTF8String[k] >=
65 && str.UTF8String[k] <=97 || (str.UTF8String[k]=='\'') || (str.UTF8String[k]=='-' )) {
wordStr = [wordStr stringByAppendingFormat:@"%c",str.UTF8String[k]];
}else {
if (wordStr.length >0) {
[wordArray addObject:wordStr];
wordStr = @"";
}
}
}
return wordArray;
}
从以上可以看出,方法二较为简便,推荐用方法二。
相关文章推荐
- 对于两栏布局可能出现的几种情况的思考
- (转)F# 统计一段英文文章中不同单词出现的次数
- 【代码】统计文件中,不同字符出现的次数(可排序,没有处理英文单词、数字和大小写)
- JAVA-统计英文句子中出现次数最多的单词和出现的次数
- Java统计英文句子中出现次数最多的单词并计算出现次数的方法
- c#中sqlite在不同机器上可能出现不能读取的情况
- F# 统计一段英文文章中不同单词出现的次数
- 超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小
- 一个利用map统计一段英文文章中每个单词出现次数的小程序
- [导入]给定一个英文原文,统计文件里面一共有多少个不同的英文单词
- 超时时间已到。在从池中获取连接之前超时时间已过。出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小。
- 统计一篇英文文件中,单词出现的次数,并按单词的长度进行排序
- 超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
- RHCE考试Troubleshooting中,linux 系统不能开机或可能出现的错误情况
- 在从池中获取连接之前超时时间已过。出现这种情况可能是因为所有池连接
- 统计该短文中不同单词和它的出现次数
- 在非英文区域系统中使用英文版Expression Encoder命令行可能出现的问题
- Java 读取一段英文文档统计每个单词出现的次数和单词的总数
- 超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
- 给定一个英文原文,统计文件里面一共有多少个不同的英文单词