从前,有一个程序员,他得到了一盏神灯。灯神答应实现他一个愿望。然后他向神灯许愿,希望在有生之年能写一个好项目。后来….后来….. 他得到了永生。

 

关于字符串,这里我总结一些方法案例:

一、compare:

(判断两对象值的大小,按字母顺序进行比较)

NSString *string = @”9.1.1″;

[string compare:@”9.1.1″];返回的类型是NSComparisonResult 的NSOrderedSame(= 等于)

[string compare:@”9.2.1″];返回的是NSOrderedAscending (后面一个字符串大于前面一个 升序)

[string compare:@”9.0.1″];返回的是NSOrderedDescending (后面一个字符串小于前面一个 降序)

 

在系统内部的样式

typedef NS_ENUM(NSInteger, NSComparisonResult)

{
NSOrderedAscending = -1L,

NSOrderedSame,

NSOrderedDescending

};

一般情况下我们可以使用这个来进行版本号的对比:

例子:

NSString *num1 = @”5.2.0″;
NSString *num2 = @”5.3.0″;
if ([num1 compare:num2 options:NSNumericSearch] == NSOrderedDescending){
ULog(@”%@ is bigger”,num1);
}else{
ULog(@”%@ is bigger”,num2);
}

解释:

NSOrderedDescending是降序,如果numb1>numb2用这个函数相比较那么就等于降序。

字符串的比对结果NSComparisonResult(在NSObjCRunTime.h中定义)是按照字符的ASCII值进行比对的

NSString * str1 = @”abc”;

NSString * str2 = @”abd”;

NSString * str3 = @”ABC”;

NSString * str4 = @”abc”;

NSString * str5 = @”123″;

那么,

[str1 compare:str2] == NSOrderedAscending;//(升序)

[str2 compare:str1] == NSOrderedDescending;//(降序)

[str1 compare:str3] == NSOrderedDescending;//(降序)

[str1 compare:str4] == NSOrderedSame;//(同序)

[str1 compare:str5] == NSOrderedDescending;//(降序)

(compare的比对含义:左比右 左侧的数值小于(等于或者大于)右侧的值,即compare的目标值(右边的值)相比于参数值(左边的值)在字母表中的排序位置更靠后(相同或者靠前))

(出现问题:

原因:是由于字符串他的比对是逐位从左到右的比对的,9是比1大的。所以出现上面的问题。

同样:

%title插图%num

它的比对成功也是由于@”90.0.1″的第二位0在ASCII表中的位置在.之后。是错误的比对误造成正确的@”90.0.1″大于@”9.0.1″的样子。

同样,对于字符串长度的不一致的

%title插图%num

添加option值(改为:)

NSComparisonResult result = [string2 compare:string options:NSNumericSearch];

能够使字符串的比对添加选项option,针对数字进行比较。解决上面数据的根据字符从左至右依次比对出现的问题:

%title插图%num

扩展:

在c语言中(摘自:https://blog.csdn.net/ctrl_qun/article/details/66970652)

#include <stdio.h>

#include <string.h>

int main(void)

{
char str_1[] = “abc”;

char str_2[] = “abc”;

char str_3[] = “ABC”;

if (strcmp(str_1, str_2) == 0)

printf(“str_1 is equal to str_2. \n”);

else

printf(“str_1 is not equal to str_2. \n”);

if (strcmp(str_1, str_3) == 0)

printf(“str_1 is equal to str_3.\n”);

else

printf(“str_1 is not equal to str_3.\n”);

return 0;

}

 

上例的打印输出如下所示:

%title插图%num
strcmp()函数有两个参数,即要比较的两个字符串。strcmp()函数对两个字符串进行大小写敏感的(case-sensitiVe)和字典式的(lexicographic)比较,并返回下列值之一:
—————————————————-
返  回  值         意  义
—————————————————-
<0               *个字符串小于第二个字符串
0               两个字符串相等    ·
>0               *个字符串大于第二个字符串
—————————————————-

在上例中,当比较str_1(即“abc”)和str_2(即“abc”)时,strcmp()函数的返回值为0。然而,当比较str_1(即”abc”)和str_3(即”ABC”)时,strcmp()函数返回一个大于0的值,因为按ASCII顺序字符串“ABC”小于“abc”。

strcmp()函数有许多变体,它们的基本功能是相同的,都是比较两个字符串,但其它地方稍有差别。下表列出了C语言提供的与strcmp()函数类似的一些函数:
—————————————————————–
函  数  名                   作  用
—————————————————————–
strcmp()         对两个字符串进行大小写敏感的比较
strcmpi()        对两个字符串进行大小写不敏感的比较
stricmp()        同strcmpi()
strncmp()        对两个字符串的一部分进行大小写敏感的比较
strnicmp()       对两个字符串的一部分进行大小写不敏感的比较
—————————————————————–
在前面的例子中,如果用strcmpi()函数代替strcmp()函数,则程序将认为字符串“ABC”等于“abc”。

 

二、[ compare:(NSString *) options:(NSStringCompareOptions)];
传入 NSStringCompareOptions 枚举的值

enum{
NSCaseInsensitiveSearch = 1,//不区分大小写比较

NSLiteralSearch = 2,//区分大小写比较

NSBackwardsSearch = 4,//从字符串末尾开始搜索

NSAnchoredSearch = 8,//搜索限制范围的字符串

NSNumbericSearch = 64//按照字符串里的数字为依据,算出顺序。例如 Foo2.txt < Foo7.txt < Foo25.txt

//以下定义高于 mac os 10.5 或者高于 iphone 2.0 可用

NSDiacriticInsensitiveSearch = 128,//忽略 “-” 符号的比较

NSWidthInsensitiveSearch = 256,//忽略字符串的长度,比较出结果

NSForcedOrderingSearch = 512//忽略不区分大小写比较的选项,并强制返回 NSOrderedAscending 或者 NSOrderedDescending

//以下定义高于 iphone 3.2 可用

NSRegularExpressionSearch = 1024//只能应用于 rangeOfString:…, stringByReplacingOccurrencesOfString:…和 replaceOccurrencesOfString:… 方法。使用通用兼容的比较方法,如果设置此项,可以去掉 NSCaseInsensitiveSearch 和 NSAnchoredSearch

}

 

 

(可以多个条件一起约束

例如:

BOOL result = [astring01 compare:astring02 options:NSCaseInsensitiveSearch | NSNumericSearch] == NSOrderedSame;    //NSCaseInsensitiveSearch:不区分大小写比较 NSLiteralSearch:进行完全比较,区分大小写 NSNumericSearch:比较字符串的字符个数,而不是字符值)

三、[ compare:(NSString *) options:(NSStringCompareOptions) range:(NSRange)];
range:(NSRange)

比较字符串的范围

结构变量:

typedef struct _NSRange {
NSUInteger location;  //需要比较的字串起始位置(以0为起始)

NSUInteger length;  //需要比较的字串长度

} NSRange;

 

NSRange的使用:

NSRange range1 = {2,4};

NSRange range4 = NSMakeRange(2, 5);

//截取字符串

NSString *homebrew = @”cushy yigexinshuju caicaikan”;

 

NSLog(@”%@”, [homebrew substringWithRange:range1]);

NSLog(@”%@”, [homebrew substringWithRange:range4]);

//查找字符串

NSRange range2 = [homebrew rangeOfString: @”cai”];

NSLog(@”range:%@”, NSStringFromRange(range2));

NSRange range3 = [homebrew rangeOfString:@”xinshu”];

NSLog(@”range:%@”, NSStringFromRange(range3));

//反向查找字符串的位置

NSRange range5 = [homebrew rangeOfString:@”ju”];

NSLog(@”%@”, NSStringFromRange(range5));

NSRange range6 = [homebrew rangeOfString:@”ju” options: NSBackwardsSearch];

NSLog(@”%@”, NSStringFromRange(range6));

 

四、改变字符串的大小写
NSString *string1 = @”A String”;

NSString *string2 = @”String”;

NSLog(@”string1:%@”,[string1 uppercaseString]);//大写

NSLog(@”string2:%@”,[string2 lowercaseString]);//小写

NSLog(@”string2:%@”,[string2 capitalizedString]);//首字母大小