iOS中字符串的用法,看这里就够了(详细)

这篇文章主要详细介绍iOS中字符串的各种用法,如果发现不够完善可以提交意见,主要是方便对字符串的使用的理解 内容比较多但是详细,如果觉得以后用得着的地方可以先收藏着;

NSString的基本概念 (NSString是不可变字符串)

什么是NSString?

一个NSString代表一个字符串(文字内容)
一般称NSString为字符串类

NSString的创建方式 (两种)

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    
//    [self create1];
    [self create2];

}
/** 第一种创建方式 */
//常量区中的字符串只要内容一致, 不会重复创建
- (void)create1
{
    NSString *str1 = @"lion";
    NSString *str2 = @"lion";
    //输出地址不一样
    NSLog(@"\n %p \n %p",&str1,&str2);
}
/** 第二种创建方式 */
//堆区中得字符串哪怕内容一致, 也会重复创建
- (void)create2
{
//stringWithFormat 可以进行拼接
    NSString *str1 = [NSString stringWithFormat:@"lion"];
    NSString *str2 = [NSString stringWithFormat:@"lion"];
    //输出地址相同
    NSLog(@"\n %p \n %p",str1,str2);

}

NSString的读写

读取:

// 用来保存错误信息
NSError *error = nil;

// 读取文件内容
NSString *str = [NSString stringWithContentsOfFile:@"/Users/LJH/Desktop/Lion.txt" encoding:NSUTF8StringEncoding error:&error];

// 如果有错误信息
if (error) {
    NSLog(@"读取失败, 错误原因是:%@", [error localizedDescription]);
} else { // 如果没有错误信息
    NSLog(@"读取成功, 文件内容是:\n%@", str);
}

写入:

// writeToFile 写入
NSString *str = @"Lion";
BOOL flag = [str writeToFile:@"/Users/LJH/Desktop/Lion.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
if (flag == 1)
{
    NSLog(@"写入成功");
}
//注意: 重复写入同一个文件会覆盖上一个文件

字符串的比较

NSString的大小写属性

全部字符转为大写字母
- (NSString *)uppercaseString;

全部字符转为小写字母
- (NSString *)lowercaseString

首字母变大写,其他字母都变小写
- (NSString *)capitalizedString

NSString的比较
one:

- (BOOL)isEqualToString:(NSString *)aString;
两个字符串的内容相同就返回YES, 否则返回NO
    NSString *str1 = @"lion";
    NSString *str2 = [NSString stringWithFormat:@"lion"];
    if ([str1 isEqualToString:str2]) {
        NSLog(@"字符串内容一样");
    }

    if (str1 == str2) {
        NSLog(@"字符串地址一样");
    }

two:

- (NSComparisonResult)compare:(NSString *)string;
这个方法可以用来比较两个字符串内容的大小
比较方法: 逐个字符地进行比较ASCII值,返回NSComparisonResult作为比较结果
NSComparisonResult是一个枚举,有3个值:
如果左侧 > 右侧,返回NSOrderedDescending,
如果左侧 < 右侧,返回NSOrderedAscending,
如果左侧 == 右侧返回NSOrderedSame
    NSString *str1 = @"abc";
    NSString *str2 = @"abd";
    switch ([str1 compare:str2]) {
        case NSOrderedAscending:
            NSLog(@"后面一个字符串大于前面一个");
            break;
        case NSOrderedDescending:
            NSLog(@"后面一个字符串小于前面一个");
            break;
        case NSOrderedSame:
            NSLog(@"两个字符串一样");
            break;
    }
    输出结果: 后面一个字符串大于前面一个

three:

- (NSComparisonResult) caseInsensitiveCompare:(NSString *)string;
忽略大小写进行比较,返回值与compare:一致

字符串搜索

- (BOOL)hasPrefix:(NSString *)aString;

是否以aString开头
- (BOOL)hasSuffix:(NSString *)aString;

是否以aString结尾
- (NSRange)rangeOfString:(NSString *)aString;

用来检查字符串内容中是否包含了aString
如果包含, 就返回aString的范围
如果不包含, NSRange的location为NSNotFound, length为0

NSRange基本概念

NSRange是Foundation框架中比较常用的结构体, 它的定义如下:
typedef struct _NSRange {
    NSUInteger location;
    NSUInteger length;
} NSRange;
// NSUInteger的定义
typedef unsigned int NSUInteger;
NSRange用来表示事物的一个范围,通常是字符串里的字符范围或者数组里的元素范围

NSRange有2个成员

NSUInteger location : 表示该范围的起始位置
NSUInteger length : 表示该范围内的长度
比如@“I Miss You Lion”中的@“Lion”可以用location为11,length为4的范围来表示

NSRange的创建

有3种方式创建一个NSRange变量
方式1
NSRange range;
range.location = 11;
range.length = 4;
方式2
NSRange range = {11, 4};
或者
NSRange range = {.location = 11,.length = 4};
方式3 : 使用NSMakeRange函数
NSRange range = NSMakeRange(11, 4);

字符串的截取

one:
- (NSString *)substringFromIndex:(NSUInteger)from;
从指定位置from开始(包括指定位置的字符)到尾部
- (void)subFrom
{
    //字符从0开始算
    NSString *str = @"<head>会跳舞的狮子</head>";
    str = [str substringFromIndex:6];
    NSLog(@"str = %@", str);
    //打印结果 str = 会跳舞的狮子</head>
}

two:
- (NSString *)substringToIndex:(NSUInteger)to;
从字符串的开头一直截取到指定的位置to,但不包括该位置的字符
- (void)subTo
{
    NSString *str = @"<head>会跳舞的狮子</head>";
    str = [str substringToIndex:12];
    NSLog(@"str = %@", str);
    //打印结果 str = <head>会跳舞的狮子
}

three:
- (NSString *)substringWithRange:(NSRange)range;
按照所给出的NSRange从字符串中截取子串
- (void)subWithRange
{
    NSString *str = @"<head>会跳舞的狮子</head>";
    NSRange range;
    /*
     range.location = 6;
     range.length = 6;
     */
    range.location = [str rangeOfString:@">"].location + 1;
    range.length = [str rangeOfString:@"</"].location - range.location;
    NSString *result = [str substringWithRange:range];
    NSLog(@"result = %@", result);
    //打印结果   会跳舞的狮子
}

字符串的替换

- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement;
用replacement替换target
- (void)Replacing
{
    NSString *str = @"http:**www.baidu.com*lion.png";
    NSString *newStr = [str stringByReplacingOccurrencesOfString:@"*" withString:@"/"];
    NSLog(@"newStr = %@", newStr);

}


- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;
去除首尾
- (void)Trimming
{
    NSString *str =  @"   http://baidu.com/lion.png   ";
    //去除首尾的空格
    NSString *newStr = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    NSLog(@"str =|%@|", str);
    NSLog(@"newStr =|%@|", newStr);
    /*
     打印结果
     str =|   http://baidu.com/lion.png   |
     newStr =|http://baidu.com/lion.png|
     */

}

字符串与路径

NSString 与 路径

one:
- (BOOL)isAbsolutePath;
是否为绝对路径
- (void)isAbsolutePath
{
    // 其实就是判断是否以/开头
    NSString *str = @"/Users/LJH/Desktop/Lion.txt";
    NSString *str = @"Users/LJH/Desktop/Lion.txt";
    if ([str isAbsolutePath]) {
        NSLog(@"是绝对路径");
    }else
    {
        NSLog(@"不是绝对路径");
    }
}

two:
- (NSString *)lastPathComponent;
获得最后一个目录
- (void)lastPathComponent
{

    // 截取最后一个/后面的内容
    NSString *str = @"/Users/LJH/Desktop/Lion.txt";
    NSString *component = [str lastPathComponent];
    NSLog(@"component = %@", component);
}

three:
- (NSString *)stringByDeletingLastPathComponent;
删除最后一个目录
- (void)stringByDeletingLastPathComponent
{
    // 其实就是上次最后一个/和之后的内容
    NSString *str = @"/Users/LJH/Desktop/Lion.txt";
    NSString *newStr = [str stringByDeletingLastPathComponent];
    NSLog(@"newStr = %@", newStr);
    //打印结果:newStr = /Users/LJH/Desktop
}

four:
- (NSString *)stringByAppendingPathComponent:(NSString *)str;在路径的后面拼接一个目录 (也可以使用stringByAppendingString:或者stringByAppendingFormat:拼接字符串内容)
- (void)stringByAppendingPathComponent
{
    // 其实就是在最后面加上/和要拼接得内容
    // 注意会判断后面有没有/有就不添加了, 没有就添加, 并且如果有多个会替换为1个
    //    NSString *str = @"/Users/NJ-Lee/Desktop";
    NSString *str = @"/Users/LJH/Desktop/";
    NSString *newStr = [str stringByAppendingPathComponent:@"Lion"];
    NSLog(@"newStr = %@", newStr);
    //打印结果:newStr = /Users/LJH/Desktop/Lion
}

NSString 与 文件拓展名


- (void)pathExtension
{
one:
- (NSString *)pathExtension;
获得拓展名
    // 其实就是从最后面开始截取.之后的内容
    //    NSString *str = @"Lion.txt";
    NSString *str = @"abc.Lion.txt";
    NSString *extension = [str pathExtension];
    NSLog(@"extension = %@", extension);
  //打印结果:extension = txt
}

two:
- (NSString *)stringByDeletingPathExtension;
删除尾部的拓展名
- (void)stringByDeletingPathExtension
{
    // 其实就是上次从最后面开始.之后的内容
    NSString *str = @"love.Lion.txt";
    NSString *newStr = [str stringByDeletingPathExtension];
    NSLog(@"newStr = %@", newStr);
    //打印结果 newStr = love.Lion

}

three:
- (NSString *)stringByAppendingPathExtension:(NSString *)str;
在尾部添加一个拓展名
- (void)stringByAppendingPathExtension
{
    // 其实就是在最后面拼接上.和指定的内容
    NSString *str = @"Lion";
    NSString *newStr = [str stringByAppendingPathExtension:@"png"];
    NSLog(@"newStr = %@", newStr);
    //打印结果:  newStr = Lion.png
}

字符串与基本数据类型的转换

- (NSUInteger)length;
返回字符串的长度(有多少个文字)

- (unichar)characterAtIndex:(NSUInteger)index;
返回index位置对应的字符


转为基本数据类型
- (double)doubleValue;
- (float)floatValue;
- (int)intValue;
    NSString *str1 = @"22";
    NSString *str2 = @"22";
    int res = str1.intValue + str2.intValue;
    NSLog(@"res = %i", res);

    NSString *str1 = @"22";
    NSString *str2 = @"22.2";
    double res = str1.doubleValue + str2.doubleValue;
    NSLog(@"res = %f", res);

转为C语言中的字符串
- (char *)UTF8String;
    NSString *str = @"love";
    const char *cStr = [str UTF8String];
    NSLog(@"cStr = %s", cStr);

    char *cStr = "love";
    NSString *str = [NSString stringWithUTF8String:cStr];
    NSLog(@"str = %@", str);

将一个字符串分隔成多个字符串

    // 将一个字符串分隔成多个字符串
    //- (NSArray *)componentsSeparatedByString:(NSString *)separator
- (void)componentsSeparatedByString
{
    // 假如有一个字符串
    NSString *list = @"java,oc,c,swift";
 
    // 可以用上面的函数得到一个字符串数组: 
    NSArray *listItems = [list componentsSeparatedByString:@","];
    // 这个数组就是把原来的字符串用","分割得到的多个字符串:
    //所以如果用这个方法就可以将字符串分隔多个字符串,然后存放到数组里面,在数组中取出想要的字符串
    NSLog(@"%@",listItems);
    //打印结果见下:
    /*
     2016-05-30 11:09:22.337 NSString的基本使用[1277:56593] (
     java,
     oc,
     c,
     swift
     )
     
     */
}

NSMutableString的用法 (NSMutableString是可变字符串)

NSMutableString的基本概念

  • NSMutableString 类 继承NSString类,那么NSString 􏰀供的方法在NSMutableString中基本都可以使用,NSMutableString好比一个字符串链表,它可以任意的动态在字符串中添加字符 串 删除字符串 指定位置插入字符串,使用它来操作字符串会更加灵活。
  • NSMutableString和NSString的区别
    NSString是不可变的, 里面的文字内容是不能进行修改的 + NSMutableString是可变的, 里面的文字内容可以随时更改
    NSMutableString能使用NSString的所有方法

字符串中的可变和不可变

不可变:指的是字符串在内存中占用的存储空间固定,并且存储的内容不能发生变化
- (void)str
{
    // 改变了指针的指向, 并没有修改字符串
    NSString *str = @"lion";
    str = @"Lion";
    
    // 生成了一个新的字符串, 并没有修改字符串
    NSString *newStr = [str substringFromIndex:1];
    NSLog(@"str = %@", str);
    NSLog(@"newStr = %@", newStr);

}



可变:指的是字符串在内存中占用的存储空间可以不固定,并且存储的内容可以被修改
- (void)strM
{
    //可变的不能赋值给不可变的
    //只有不可变的才能赋值给可变的
    NSString *str = nil;
    NSMutableString *strM = [NSMutableString string];
    NSLog(@"strM = %@", strM);
    // 修改原有字符串, 没有生成新的字符串
    [strM appendString:@"Lion"];
    NSLog(@"strM = %@", strM);
    [strM appendString:@" love you "];
    NSLog(@"strM = %@", strM);
    str = strM;
    NSLog(@"str = %@",str);
}

NSMutableString常用方法

one:
- (void)appendString:(NSString *)aString;
拼接aString到最后面
- (void)appendFormat:(NSString *)format, ...;
拼接一段格式化字符串到最后面
- (void)appendStrM
{
    NSMutableString *strM = [NSMutableString string];
    NSLog(@"strM = %@", strM);
    [strM appendString:@"Lion"];
    NSLog(@"strM = %@", strM);

}

two:

- (void)deleteCharactersInRange:(NSRange)range;
 删除range范围内的字符串
- (void)deleteCharactersInRange
{
    NSMutableString *strM = [NSMutableString stringWithString:@"http://www.baidu.com"];
    // 一般情况下利用rangeOfString和deleteCharactersInRange配合删除指定内容
    NSRange range = [strM rangeOfString:@"http://"];
    [strM deleteCharactersInRange:range];
    NSLog(@"strM = %@", strM);
    //打印内容: strM = www.baidu.com

}

three:
- (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc;
在loc这个位置中插入aString
- (void)insertString
{
    NSMutableString *strM = [NSMutableString stringWithString:@"www.baidu.com"];
    [strM insertString:@"http://" atIndex:0];
    NSLog(@"strM = %@", strM);
    //打印内容: strM = http://www.baidu.com

}



four:
- (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)aString;
  使用aString替换range范围内的字符串

- (void)replaceOccurrencesOfString
{
    NSMutableString *strM = [NSMutableString stringWithString:@"http://www.baidu.com/lion.png"];
    NSRange range = [strM rangeOfString:@"lion"];
    [strM replaceOccurrencesOfString:@"lion" withString:@"super Man" options:0 range:range];
    NSLog(@"strM = %@", strM);
    //打印内容:strM = http://www.baidu.com/super Man.png

}

在iOS8以后,还可以用下面的方法来判断是否包含某字符串:containsString
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容