NSString+基本的字符串操作

NSString对象由unichar字符组成。unichar字符是符合Unicode标准的多字节字符。
要使用Objective-C语言创建一个常量字符串对象,需要在字符串开头放置一个@字符,表达式
@”string“
创建了一个常量字符串对象。特殊情况下,它属于NSConstantString类的常量字符串对象。NSConstantString类是字符串对象NSString类的子类。

>基本字符串操作

1、创建一个常量字符串

//创建字符串对象(像这样,会创建一个内容不可变的对象,这称为不可变对象。)
 NSString *string=@"test";

将string声明为不可变字符串对象,意味着它们所引用的字符串对象的字符不可以改变。然而,引用string是可以改变的,也就是说,可以重新为它指定其他的不可变字符串对象。这一点非常重要。

2、stringWithFormat

a.)stringWithFormat方法在使用上与NSLog相似。不同的是这个方法返回格式化的字符,而不是写入控制台。
b.)像stringWithFormat:这样的方法允许提供多个参数(stringWithFormat:需要的参数是格式化字符串和需要格式化的数据)。这些参数使用一系列逗号分隔提供给方法。

//1、输出一个字符串
//结果:2017-07-14 16:35:44.240 To Do List[2444:131657] There will be a string named hello

NSString *string;
string=[NSString stringWithFormat:@"There will be a string named %s","hello"];
NSLog(@"There will be a string named %s","hello");



//2.1、输出多个字符串
//结果:2017-07-14 17:30:55.276 To Do List[2527:144680] number1,number2

NSString *string;
NSString *string1=@"number1";
NSString *string2=@"number2";
string=[NSString stringWithFormat:@"%@,%@",string1,string2];
NSLog(@"%@",string);

//2.2、输出多个字符串
//结果:2017-07-14 17:37:25.452 To Do List[2559:147011] number1,number2

 NSString *string;
 string=[NSString stringWithFormat:@"%@,%@",@"number1",@"number2"];
 NSLog(@"%@",string);



//3、错误示例,将会有多个警告
//结果:2017-07-14 17:34:18.391 To Do List[2543:145832] number1

NSString *string;
NSString *string1=@"number1";
NSString *string2=@"number2";
string=[NSString stringWithFormat:@"number1",@"number2"];
NSLog(@"%@",string);

3、计算一个字符串的长度

length方法可以用来对字符串中的字符进行计数。它将返回NSUInteger类型的无符号整数值。

//结果是:2017-07-14 20:37:40.873 To Do List[518:5848] length of string:17 

NSString *string=@"This is a string.";
NSLog(@"length of string:%lu ",[string length]);

4、验证两个字符串是否相等

isEqualToString


//[@"字符" isEqualToString: string]或[string isEqualToString:@"字符"]

//1、如果operation的符号是“+”,那么把两个数值相加
 double result=0;
 if([operation isEqualToString:@"+"]){

                 result=[self popOperand]+[self popOperand];

               }


//2、结果:2017-07-14 17:13:18.101 To Do List[2479:139530] Equal
NSString *string1=@"number1";
NSString *string2=@"number1";
BOOL result=[string1 isEqualToString:string2];
if(result){
              NSLog(@"Equal");
 }

5、验证一个字符串是否小于、等于或大于另一个字符串

compare(它的返回类型是:NSOrderedAscending(-1对于布尔值,总是错的),NSorderedSame,NSorderedDescending(分别等于整数-1,0,1)。)

//
//结果;2017-07-14 17:18:27.566 To Do List[2495:141038] equal

 NSString *string1=@"number1";
 NSString *string2=@"number1";
 BOOL result=[string1 compare:string2];
 if(result==NSOrderedSame){
              NSLog(@"equal");
 }

//
//结果是:2017-07-15 09:09:01.384 To Do List[607:10340] string1>string2
NSComparisonResult compareResult;
NSString *string1=@"This is a string";
NSString *string2=@" in Xcode.";

compareResult=[string1 compare:string2];

if(compareResult==NSOrderedAscending)
{
               NSLog(@"string1<string2");

}else if (compareResult==NSOrderedSame)
{
               NSLog(@"string1==string2");

}else //必须是NSOrderedDescending
{
               NSLog(@"string1>string2");
}

如果不想进行大小写敏感的比较,可以使用caseInsensitiveCompare:方法,而不是用compare:方法。如,使用caseInsensitiveCompare比较字符串对象@”THIS“和@”this“,会相等。

6、字符串与数值的转化

//字符串转化为数字,这里转化为16进制数
//结果是:2017-07-14 17:48:42.775 To Do List[2665:151828] 10

 NSString *string=@"16";
 int number=[string intValue];
 NSLog(@"%x",number);

//数字转化为字符串
//结果是:2017-07-14 17:56:59.482 To Do List[2741:155839] 13

int number=13;
NSString *string=[NSString stringWithFormat:@"%d",number];
NSLog(@"%@",string);

7、插入字符

//注意插入的位置,插入的字符(包括空格)
//结果是:2017-07-14 19:47:58.147 To Do List[2862:174940] This is Xcode.

NSMutableString *string[NSMutableString stringWithFormat:@"This Xcode."];

[string insertString:@"is " atIndex:5];
NSLog(@"%@",string);

8、删除字符

NSMakeRange是一个结构体类型,包含两个参数(NSUInteger loc和NSUInteger len),位置和长度。表示字符串要传进来从哪里开始的位置和需要的长度。NSMakeRange(<#NSUInteger loc#>, <#NSUInteger len#>)。

//结果是:2017-07-14 19:54:43.149 To Do List[2879:176779] This is Xcode.

NSMutableString *string=[NSMutableString stringWithFormat:@"This is the Xcode."];
[string deleteCharactersInRange:NSMakeRange(8, 4)];
NSLog(@"%@",string);

9、将一个字符串复制到另外一个字符串

//把string1的字符串复制到string上,结果是:2017-07-14 20:43:24.652 To Do List[554:8063] copy:This is a string. 

NSString *string;
NSString *string1=@"This is a string.";

string=[NSString stringWithString:string1];
NSLog(@"copy:%@ ",string);

string=[NSString stringWithString:string1];

说明如何使用另一个字符串的内容生成一个新的字符串。NSString对象被赋值给string,在这里进行的实际上是字符串内容的复制,而不是对内存中同一个字符串的引用,即string1 和string指向两个不同的字符串对象,这与简单地执行以下赋值操作是不同的:(这仅仅是创建了内存中同一个对象的另一个引用)

string=string1;

10、将一个字符串复制到另一个字符串的末尾

使用stringByAppendingString:方法可以连接两个字符串。所以表达

string2=[string1 stringByAppendingString:string2];

创建了一个新的字符串对象,这个对象由string1 和string2的字符拼接而成,这项操作没有改变原字符串对象string1和string2(它们不能更改,因为都是不可变字符串对象)

//结果是:2017-07-14 20:51:16.851 To Do List[600:10836] Concatentation:This is a string in Xcode.

NSString *string1=@"This is a string";
NSString *string2=@" in Xcode.";
string2=[string1 stringByAppendingString:string2];
NSLog(@"Concatentation:%@ ",string2);

11、将字符串转换为大写

(不影响原始的字符串)

//结果是:2017-07-15 09:16:21.330 To Do List[626:12263] Uppercase conversion:THIS IS A STRING

NSString *string;
NSString *string1=@"This is a string";
string=[string1 uppercaseString];
NSLog(@"Uppercase conversion:%s",[string UTF8String]);

12、将字符串转换为小写

(不影响原始的字符串)

//结果是:2017-07-15 09:20:25.294 To Do List[678:14263] lowercase conversion:this is a string

NSString *string;
NSString *string1=@"THIS IS a STRING";
string=[string1 lowercaseString];
NSLog(@"lowercase conversion:%s",[string UTF8String]);

13、从字符串中提取前n个字符

substringToIndex:方法创建了一个子字符串,包括首字符到指定的索引数,但不包括这个字符。因为索引数是从零开始的,所以参数3表示从字符串中提取字符0、1、2,并返回结果字符串对象。对于所有采取索引数作为参数的字符串方法,如果提供的索引数对该字符串无效,就会获得Range or index out of bounds的出错消息。

//从字符串中提取前3个字符
//结果:2017-07-15 10:56:11.864 To Do List[784:31186] First 3 chars of string1:Thi   

NSString *string;
NSString *string1=@"This is a string";
string=[string1 substringToIndex:3];
NSLog(@"First 3 chars of string1:%@",string);

14、提取从索引n开始直到结尾的子字符串

//提取从索引6开始直到结尾的子字符串
结果是:017-07-15 10:59:05.013 To Do List[801:32171] Chars from index 6 of string1:s a string              

NSString *string;
NSString *string1=@"This is a string";
string=[string1 substringFromIndex:6];
NSLog(@"Chars from index 6 of string1:%@",string);

15、提取从索引n开始到索引m的子字符串

//15.1、从索引8开始到索引13的子字符串(6个字符8、9、10、11、12、13)
//结果:2017-07-15 11:06:25.342 To Do List[818:34125] Chars from index 8 throght 13 of string1:a stri

NSString *string;
NSString *string1=@"This is a string";
string=[[string1 substringFromIndex:8] substringToIndex:6];
NSLog(@"Chars from index 8 throght 13 of string1:%@",string);


//15.2、更简单的方法(第8个字符开始,提取6个字符)
NSString *string;
NSString *string1=@"This is a string";
string=[string1 substringWithRange:NSMakeRange(8, 6)];

16、从一个字符串中查找另一个字符串

// 结果是:2017-07-15 11:18:03.234 To Do List[850:37301] String is at index 10,length is 6
2017-07-15 11:18:03.235 To Do List[850:37301] String not found

NSRange subRange;
NSString *string1=@"This is a string";

//从string1中找字符串@“string”
subRange=[string1 rangeOfString:@"string"];
NSLog(@"String is at index %lu,length is %lu",subRange.location,subRange.length);

 //从string1中找字符串@“stringA”,如果没有找到这个字符串,则返回范围的location成员被设置成为NSNotFound。              
subRange=[string1 rangeOfString:@"stringA"];
if(subRange.location==NSNotFound){
                NSLog(@"String not found");
}else{
                NSLog(@"String is at index %lu,length is %lu",subRange.location,subRange.length);

}

语句
subRange=[string1 rangeOfString:@”string”];

把方法返回的NSRange结构赋值给NSRange变量subRange。一定要注意,subRange不是对象变量,而是一个结构体变量(并且程序中的subRange声明不包括星号,这通常意味着不是在处理一个对象,不过id类型是个意外)。通过使用结构体成员操作符(.),可以检索其成员。所以,表达式subRange.location给出了该结构中成员location的值,subRange.length给出结构成员length的值,将这些值传递给NSLog函数显示。

>可变字符串的基本字符串操作

NSMutableString类可以用来创建可以更改字符的字符串对象。它是NSString类的子类,所以可以使用NSString类的所有方法。
任意一个可变或不可变字符串对象在程序执行过程期间,总是可以被设为完全不同的字符串对象的。如
string1=@“This is a string”;

string1=[string1 substringFromIndex:6];

在这个例子中,首先将string1设置为一个常量字符串对象。后来在程序中将其设为一个子字符串。在这个例子中,string可以声明为可变的字符串对象,也可以声明为不可变的字符串对象,一定要理解这一点。

1、从不可变字符串创建可变字符串

//结果是:2017-07-15 11:55:46.486 To Do List[900:44966] This is a string

NSMutableString *mstr;//将mstr声明为一个变量,用来存储在程序执行过程中值可能更改的字符串对象。
NSString *string1=@"This is a string";
mstr=[NSMutableString stringWithString:string1];
NSLog(@"%@",mstr);

mstr=[NSMutableString stringWithString:string1];

将stringWithString:方法发送给NSMutableString类,返回一个可变的字符串对象。而将stringWithString:方法发送给NSString类时,则返回一个不可变的字符串对象。

2、插入字符

insertString: atIndex:方法将指定的字符串插入接收者,插入点从指定的索引值开始。

//2.1、在一个字符串某位置插入另一字符串
//结果:2017-07-15 11:59:07.084 To Do List[917:46237] This is mutable a string

NSMutableString *mstr;
NSString *string1=@"This is a string";
mstr=[NSMutableString stringWithString:string1];
[mstr insertString:@" mutable" atIndex:7];
NSLog(@"%@",mstr);


//2.2、插入末尾进行有效拼接
//结果是:2017-07-15 12:03:01.003 To Do List[946:47766] This is a string which is mutable

mstr=[NSMutableString stringWithString:string1];
[mstr insertString:@" which is mutable" atIndex:[mstr length]];


//2.3、直接使用appendString(在结尾插入)
//结果如2.2

mstr=[NSMutableString stringWithString:string1];
[mstr appendString:@" which is mutable"];

3、删除字符

//3.1、根据范围删除子字符串
//结果是:2017-07-15 14:01:49.056 To Do List[1004:52173] This is ring

NSMutableString *mstr;
NSString *string1=@"This is a string";
mstr=[NSMutableString stringWithString:string1];
[mstr deleteCharactersInRange:NSMakeRange(8, 4)];
NSLog(@"%@",mstr);


//3.2、查找然后将其删除
//结果是:2017-07-15 14:08:47.414 To Do List[1022:54314] This is a string

NSRange substr;
NSMutableString *mstr;
NSString *string1=@"This is a mutable string";
mstr=[NSMutableString stringWithString:string1];
//查找想删除的字符串,如果有,将其删除。substr=[mstr rangeOfString:@" mutable"];
if(substr.location!=NSNotFound){
              [mstr deleteCharactersInRange:substr];
              NSLog(@"%@",mstr);
}

4、直接(重新)设置为可变的字符串

//重新设置,生效
//结果是:2017-07-15 14:25:58.755 To Do List[1094:59533] This is a stringA
NSMutableString *mstr;
NSString *string1=@"This is a string";
mstr=[NSMutableString stringWithString:string1];
[mstr setString:@"This is a stringA"];
NSLog(@"%@",mstr);

//直接设置,不生效
//结果是:2017-07-15 14:30:08.803 To Do List[1111:60942] (null)
NSMutableString *mstr;
[mstr setString:@"This is a stringA"];
NSLog(@"%@",mstr);

5、替换一些字符

//5.1、已知位置的替换
//结果是:2017-07-15 14:34:07.833 To Do List[1161:62973] This is a mutable string
NSMutableString *mstr;
NSString *string1=@"This is a string";
mstr=[NSMutableString stringWithString:string1];

//将8个字符"string",替换成字符"a mutable string"
[mstr replaceCharactersInRange:NSMakeRange(8,8) withString:@"a mutable string"];
NSLog(@"%@",mstr);

//5.2、查找和替换
//结果是:2017-07-15 14:44:30.617 To Do List[1178:65537] An example of a string
NSString *search,*replace;
NSRange substr;
NSMutableString *mstr;
NSString *string1=@"This is a string";
mstr=[NSMutableString stringWithString:string1];
//要查找和替换的字符串              
search=@"This is";
replace=@"An example of";
//查找               
substr=[mstr rangeOfString:search];
//替换
if(substr.location!=NSNotFound){
            [mstr replaceCharactersInRange:substr withString:replace];
            NSLog(@"%@",mstr);
}

//5.3、查找和替换所有匹配项
//结果是:2017-07-15 14:50:47.938 To Do List[1196:67244] ThiW iW a Wtring
//要查找和替换的字符串
search=@"s";
replace=@"W";
//查找               
substr=[mstr rangeOfString:search];
//循环,直到所有"s"都被替换成"W"
while (substr.location!=NSNotFound){
              [mstr replaceCharactersInRange:substr withString:replace];
              substr=[mstr rangeOfString:search];
}
NSLog(@"%@",mstr);


如果替换的字符串为空(也就是不包含字符),那么将有效地删除所有的搜索到的字符串。没有空格隔开的相邻引号可指定为空的常量字符串,语句如下:
replace=@”“;
当然,如果只想删除字符串,则可以使用deleteCharactersInRange:方法。

上面的while循环替换为以下一行代码

//while循环替换
[mstr replaceOccurrencesOfString:search withString:replace options:nil range:NSMakeRange(0, [mstr length])];
///-(void)函数里面,option:nil,会有警告

附:字符串中的索引(索引数16,即字符串中的第17个字符)
这里写图片描述

常见的NSString方法
这里写图片描述
这里写图片描述
这里写图片描述

常见的NSMutableString 方法
这里写图片描述

参考链接:NSString(字符串)详细操作
NSString语法
《Objective-C程序设计》

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值