iOS compare字符串的比较

(每天最重要的事情是什么?(上班)还有比它更重要的事情么?(有!  加班))偷笑


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

一、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大的。所以出现上面的问题。

同样:


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

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


添加option值(改为:)

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

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


扩展:

在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;
}
上例的打印输出如下所示:   

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]);//首字母大小




猜你喜欢

转载自blog.csdn.net/bug_delete/article/details/80255203