考虑以下模式的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:@""];
答案 0 :(得分:0)
如果我正确理解了您的情况,则需要从上面的字符串中解析foo
,bar
和baz
。下面的代码将执行此操作,并在数组中返回foo
,bar
和baz
。
正如您将在代码中看到的那样,我们将一个单词和一个开头括号配对,然后以编程方式修剪括号。可能有一个更好的正则表达式不需要修剪,但是我无法使用 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
用空格替换('
和')
之间的任何内容。模式[^')]
表示我们不希望)
和'
字母出现在两者之间。