Как я могу заменить строки между шаблоном для NSString? - PullRequest
0 голосов
/ 15 марта 2019

Рассмотрим строку NSS следующего шаблона:

(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:@""];

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

Я бы просто использовал:

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

Замена всего между (' и ') пробелом. Шаблон [^')] означает, что мы не хотим, чтобы буквы ) и ' появлялись между ними.

0 голосов
/ 15 марта 2019

Если я правильно понял вашу ситуацию, вам нужно проанализировать 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:@" "];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...