如何在NSString的模式之间替换字符串?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在NSString的模式之间替换字符串?相关的知识,希望对你有一定的参考价值。
考虑以下模式的NSString:
(foo('Class 0')bar('Class 1')baz('Class 2')
我只需要返回foo
,bar
和baz
。我有什么方法可以至少用正则表达式将'Class 0'
替换为单个字符?
我试过了:
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\(.*?\)"
options:NSRegularExpressionCaseInsensitive
error:nil];
text = [regex stringByReplacingMatchesInString:text options:0 range:NSMakeRange(0, [text length]) withTemplate:@""];
答案
如果我理解你的情况,你需要从上面的字符串中解析foo
,bar
和baz
。下面的代码就是这样做的,并在数组中返回foo
,bar
和baz
。
正如您将在代码中看到的那样,我们匹配一个单词和一个开头的paren,然后以编程方式修剪parens。可能有一个更好的正则表达式,不需要修剪,但我无法使用NSRegularExpression。
NSString *text = @"(foo('Class 0')bar('Class 1')baz('Class 2')";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[a-z]+[(]"
options:NSRegularExpressionCaseInsensitive
error:nil];
NSMutableArray *output = [[NSMutableArray alloc] init];
[regex enumerateMatchesInString:text
options:0
range:NSMakeRange(0, [text length])
usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) {
NSString *rawMatch = [text substringWithRange:result.range];
NSString *trimmed = [rawMatch substringToIndex:(rawMatch.length - 1)];
[output addObject:trimmed];
}];
要获得一个字符串,就像您在上面的评论中提到的那样,只需使用
NSString *finalString = [output componentsJoinedByString:@" "];
另一答案
我会用:
NSString *string = @"foo('Class 0')bar('Class 1')baz('Class 2')";
NSString *output = [string stringByReplacingOccurrencesOfString:@"\('[^')]*'\)"
withString:@" "
options:NSRegularExpressionSearch
range:NSMakeRange(0, string.length)];
NSLog(@"%@", output); // foo bar baz
用空格替换('
和')
之间的任何东西。模式[^')]
意味着我们不希望)
和'
letters出现在它们之间。
以上是关于如何在NSString的模式之间替换字符串?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Shell 脚本中随后出现的 2 个字符串模式之间替换一个字符串?