2015-05-14 4 views
-1

У меня есть массив имен. Если какое-либо имя уже существует, то при вставке нового имени я хочу добавить счетчик, например, John (02), если Джон уже присутствует в массиве, а затем John (03), если это третья запись имени Джона.поиск NSArray с регулярным выражением

Есть ли способ фильтровать массив с помощью Regex, чтобы я мог фильтровать все записи с помощью шаблона «John (xx)»?

ответ

1

Yup. Вам нужно пройти через массив и проверить с помощью регулярного выражения. Вы должны сделать это, так как если вы просто проверить, если массив содержит вашу строку, он не возвращает истину, если вы ищете «Джон» и только один в вашем массиве «John1»

NSMutableArray *testArray = [[NSMutableArray alloc] initWithObjects:@"John", @"Steve", @"Alan", @"Brad", nil]; 

NSString *nameToAdd = @"John"; 

NSString *regex = [NSString stringWithFormat:@"%@[,]*[0-9]*", nameToAdd]; 
NSPredicate *myTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex]; 

for (int i = 0; i < [testArray count]; i++) 
{ 
    NSString *string = [testArray objectAtIndex:i]; 
    if ([myTest evaluateWithObject:string]) 
    { 
     // Matches 
     NSLog(@" match !"); 
     int currentValue; 

     NSArray *split = [string componentsSeparatedByString:@","]; 
     if ([split count] == 1) 
     { 
      // Set to 2 
      currentValue = 2; 
     } 
     else 
     { 
      currentValue = [[split objectAtIndex:1] intValue]; 
      currentValue++; 
     } 
     NSString *newString = [NSString stringWithFormat:@"%@,%d", nameToAdd, currentValue]; 
     [testArray replaceObjectAtIndex:i withObject:newString]; 
    } 
} 

for (NSString *string in testArray) 
{ 
    NSLog(@"%@", string); 
} 

Этот заменит «Джон» на «Джон, 2», и если вы в третий раз найдете «Джона», он заменит его «Иоанном, 3».

Надеется, что это помогает

+0

Спасибо, Сэм, вы ответили на мой вопрос. –

+0

Этот код выполняет множество ненужных манипуляций с строками и модификаций массива. – rmaddy

+0

Да, rmaddy. Это довольно неэффективно, но совершенно очевидно, что происходит, и отличный способ объяснить, как решить проблему. Хороший момент, хотя – Sam

0

Вы можете создать предикат для регулярного выражения, а затем фильтровать массив, используя предикат. Основываясь на подсчете совпадений, вы можете обновить добавленное новое значение по мере необходимости.

NSMutableArray *currentNames = ... // the current list of names 
NSString *newName = ... // the new name to add 
NSString *regex = [NSString stringWithFormat:@"%@ \\([0-9]*\\)", newName]; 
NSPredicate *filter = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex]; 
NSArray *matches = [currentNames filteredArrayUsingPredicate:filter]; 
if (matches.count) { 
    NSString *updatedName = [NSString stringWithFormat:@"%@ (%02d)", newName, matches.count]; 
    [currentNames addObject:updatedName]; 
} else { 
    [currentNames addObject:newName]; 
} 
0

Вы можете заполнить массив с помощью NSPredicate. Не слишком знакомы с регулярным выражением, но следующее выглядит нормально:

NSArray *array = @[@"John (01)", @"John (02)", @"John XX"]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES 'John [(]\\\\d{2}[)]'"]; 
    NSArray *result = [array filteredArrayUsingPredicate:predicate]; 
    NSLog(@"%@", result); // Output John (01), John (02) 
Смежные вопросы