如何在NSString的模式之间替换字符串?

时间:2019-03-15 04:27:04

标签: objective-c regex nsstring

考虑以下模式的NSString:

(foo('Class 0')bar('Class 1')baz('Class 2')

我只需要返回foobarbaz。我至少可以使用正则表达式将'Class 0'替换为某个单个字符吗?

我尝试过:

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\(.*?\\)"
                                                                         options:NSRegularExpressionCaseInsensitive
                                                                           error:nil];
text = [regex stringByReplacingMatchesInString:text options:0 range:NSMakeRange(0, [text length]) withTemplate:@""];

2 个答案:

答案 0 :(得分:0)

如果我正确理解了您的情况,则需要从上面的字符串中解析foobarbaz。下面的代码将执行此操作,并在数组中返回foobarbaz

正如您将在代码中看到的那样,我们将一个单词和一个开头括号配对,然后以编程方式修剪括号。可能有一个更好的正则表达式不需要修剪,但是我无法使用 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:@" "];

答案 1 :(得分:0)

我只会用:

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

用空格替换('')之间的任何内容。模式[^')]表示我们不希望)'字母出现在两者之间。