Удалить гласные из строки - PullRequest
       3

Удалить гласные из строки

1 голос
/ 29 октября 2011
NSMutableString *stringa = [[NSMutableString alloc] initWithFormat:@"%@", surnameField.text];

if ([stringa length] < 3) {
    [stringa appendString:@"x"];
}

NSMutableString *consonanti = [[NSMutableString alloc] init];

NSCharacterSet *vocali = [NSCharacterSet characterSetWithCharactersInString:@"aeiouàèìòùáéíóúAEIOUÀÈÌÒÙÁÉÍÓÚ"];

NSRange r;

for (int i=0; i < [stringa length]; i++) {

    r = [stringa rangeOfCharacterFromSet:vocali];

    if (r.location != NSNotFound) {
        [consonanti appendFormat:@"%c",[stringa characterAtIndex:i]];
    }
    else {
    }
}

cfField.text = consonanti;
[stringa release];
[consonanti release];

Результат cfField.text всегда согласен с гласными, в то время как результат должен быть только согласными. Я не знаю.

Ответы [ 4 ]

3 голосов
/ 29 октября 2011

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

В вашем цикле for вам нужен следующий код:

if(![vocali characterIsMember:[stringa characterAtIndex:i]])
    [consonanti appendFormat:@"%C",[stringa characterAtIndex:i]];

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

1 голос
/ 19 апреля 2013

Обратите внимание, что если вы используете characterAtIndex: для доступа к отдельным символам, составные символы будут разбиты на отдельные компоненты, такие как диакритический знак.

Диакритический знак в Unicode-говорит, например, акцент, как в "é" в вашей строке гласных.

Лучший способ - перебрать строку по составным символам:

// A string with composed diacritic characters
// In clear text it is "Renée Ångström"
NSString *stringWithComposedChars = @"Rene\u0301e A\u030Angstro\u0308m";
NSString *vowels = @"aeiouàèìòùáéíóúäëïöü";

NSMutableString *consonants = [NSMutableString string];

[stringWithComposedChars
 enumerateSubstringsInRange:NSMakeRange(0,[stringWithComposedChars length])
                                        options:NSStringEnumerationByComposedCharacterSequences
                                        usingBlock: ^(NSString *substring,NSRange rng1, NSRange rng2, BOOL *stop)
{
    if ( [vowels rangeOfString:substring options:NSCaseInsensitiveSearch|NSWidthInsensitiveSearch].location == NSNotFound ) {
        [consonants appendString:substring];
    }
}];

NSLog(@"Original string: \"%@\" - Vowels removed: \"%@\"", stringWithComposedChars, consonants);

Вы увидите, что этот фрагмент очищает исходную строку составленных символов как для основного гласного, так и для диакритического знака.

0 голосов
/ 15 ноября 2014

Вы можете попробовать что-то вроде:

  -(NSString *) removeVowels:(NSString *) value
  {
      NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"([A,Á,Ã,E,É,Ê,I,Í,O,Ô,Ó,Õ,U,Û,Ü,Ú]?)" options:NSRegularExpressionCaseInsensitive error:nil];
      return [regex stringByReplacingMatchesInString:value options:0 range:NSMakeRange(0, [value length]) withTemplate:@""];
  }
0 голосов
/ 19 апреля 2013

Это тоже должно сработать - сначала избавьтесь от всех вокалов, используя их в качестве символов разделения строки, затем снова объедините все полученные строки:

NSArray*  onlyConsonantsArray  = [stringa componentsSeparatedByCharactersInSet:vocali];
NSString* onlyConsonantsString = [onlyConsonantsArray componentsJoinedByString: @""];

Я не знаю о спектакле, но выглядит он коротко: -).

...