- 开发中经常出现需要移除字符串末尾的某些子字符串的情况, 比如说发布评论功能, 如果评论功能的末尾有换行符(
\n
), 那么就需要全部移除掉
一、移除字符串末尾出现的相同子字符串
/**
移除结尾的子字符串
*/
- (NSString *)removeLastSubString:(NSString *)string
{
NSString *result = self;
if ([result hasSuffix:string]) {
result = [result substringToIndex:self.length - string.length];
result = [result removeLastSubString:string];
}
return result;
}
NSString *text = @"这里是评论内容\n\n\n\n"
text = [text removeLastSubString:@"\n"];
// text 为 这里是评论内容
二、移除字符串末尾出现的多种不同子字符串
- 如果用户发布评论的时候, 在内容的结尾出现了空格和换行符混搭的情况(
和\n
), 可以使用下面的方法一起移除
- 方法实现:
/**
移除结尾的子字符串, 使用数组传递多个
*/
- (NSString *)removeLastSubStringsArray:(NSArray<NSString *> *)strings {
NSString *result = self;
BOOL isHaveSubString = NO;
for (int i = 0; i < strings.count; i++) {
NSString *subString = strings[i];
if ([result hasSuffix:subString]) {
result = [result removeLastSubString:subString];
isHaveSubString = YES;
}
}
if (isHaveSubString) {
result = [result removeLastSubStringsArray:strings];
}
return result;
}
NSString *text = @"这里是评论内容\n \n \n \n "
text = [text removeLastSubStringsArray:@[@"\n", @" "]];
// text 为 这里是评论内容
三、通过传入可变参数的方式, 移除字符串结尾多种子字符串
- 上面的
removeLastSubStringsArray
方法需要传入一个字符串数组, 这里新定义一个removeLastSubStrings
方法, 只需要传入数量不定的可变参数即可
- 方法定义:
/**
移除结尾的子字符串, 可以输入多个
*/
- (NSString *)removeLastSubStrings:(NSString *)string, ... NS_REQUIRES_NIL_TERMINATION
{
NSMutableArray *tempArr = @[].mutableCopy;
if (string) {
// 取出第一个参数
[tempArr addObject:string];
// 定义一个指向个数可变的参数列表指针;
va_list args;
// 用于存放取出的参数
NSString *arg;
// 初始化变量刚定义的va_list变量,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数
va_start(args, string);
// 遍历全部参数 va_arg返回可变的参数(a_arg的第二个参数是你要返回的参数的类型)
while ((arg = va_arg(args, NSString *))) {
[tempArr addObject:arg];
}
// 清空参数列表,并置参数指针args无效
va_end(args);
}
return [self removeLastSubStringsArray:tempArr];
}
NSString *text = @"这里是评论内容\n \n \n \n "
text = [text removeLastSubStringsArray:@"\n", @" ", nil];
// text 为 这里是评论内容
结尾: 所有的方法整合
/**
移除结尾的子字符串, 可以输入多个
*/
- (NSString *)removeLastSubStrings:(NSString *)string, ... NS_REQUIRES_NIL_TERMINATION
{
NSMutableArray *tempArr = @[].mutableCopy;
if (string) {
// 取出第一个参数
[tempArr addObject:string];
// 定义一个指向个数可变的参数列表指针;
va_list args;
// 用于存放取出的参数
NSString *arg;
// 初始化变量刚定义的va_list变量,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数
va_start(args, string);
// 遍历全部参数 va_arg返回可变的参数(a_arg的第二个参数是你要返回的参数的类型)
while ((arg = va_arg(args, NSString *))) {
[tempArr addObject:arg];
}
// 清空参数列表,并置参数指针args无效
va_end(args);
}
return [self removeLastSubStringsArray:tempArr];
}
/**
移除结尾的子字符串, 使用数组传递多个
*/
- (NSString *)removeLastSubStringsArray:(NSArray<NSString *> *)strings {
NSString *result = self;
BOOL isHaveSubString = NO;
for (int i = 0; i < strings.count; i++) {
NSString *subString = strings[i];
if ([result hasSuffix:subString]) {
result = [result removeLastSubString:subString];
isHaveSubString = YES;
}
}
if (isHaveSubString) {
result = [result removeLastSubStringsArray:strings];
}
return result;
}
/**
移除结尾的子字符串
*/
- (NSString *)removeLastSubString:(NSString *)string
{
NSString *result = self;
if ([result hasSuffix:string]) {
result = [result substringToIndex:self.length - string.length];
result = [result removeLastSubString:string];
}
return result;
}
网友评论