Эффективный способ или замена «а» на «ан»? - PullRequest
0 голосов
/ 04 апреля 2020

В моем последнем проекте я динамически строю предложения, а затем, по факту, перебираю текст, чтобы грамматически «очистить вещи». Одна из моих задач - переключить вхождения «а» на «ан», где первая буква следующего слова - гласная. На данный момент меня интересуют только слова языка Engli sh в нижнем регистре, и я игнорирую следующие слова, начинающиеся с 'h'.

Решение, которое у меня есть, теперь работает, но выглядит ужасно неэффективно и определенно не будет масштабироваться, если я захочу поддержать интернационализацию в будущем.

    if ([destination rangeOfString:@" a "].location != NSNotFound) {
        destination = [destination stringByReplacingOccurrencesOfString:@" a a" withString:@" an a"];
        destination = [destination stringByReplacingOccurrencesOfString:@" a e" withString:@" an e"];
        destination = [destination stringByReplacingOccurrencesOfString:@" a i" withString:@" an i"];
        destination = [destination stringByReplacingOccurrencesOfString:@" a o" withString:@" an o"];
        destination = [destination stringByReplacingOccurrencesOfString:@" a u" withString:@" an u"];
    }

Я проверяю случай «а» заранее, просто чтобы пропустить неэффективность всех этих замещающих линий. Я думаю, что должен быть способ сделать это более гладким, более эффективным способом, возможно, используя регулярные выражения?

1 Ответ

2 голосов
/ 05 апреля 2020

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

Вот пример:

NSString* source = @"What is a apple doing in a toilet? A umbrella is in there too!";

NSRegularExpression *regex = [NSRegularExpression
                              regularExpressionWithPattern:@"\\b([Aa])( [aeiou])"
                              options:0
                              error:nil];
NSString* result = [regex
                     stringByReplacingMatchesInString:source
                     options:0
                     range:NSMakeRange(0, [source length])
                     withTemplate:@"$1n$2"];

A пара незначительных замечаний:

  • Записи options:0 и error:nil - это просто мои варианты, которые могут быть полезны в реальном случае.
  • Я добавил это слово границу (\\b), чтобы поймать то, что я представляю, может быть хитрым после пунктуации вхождения "а" (например, "Шел дождь; появился дождевой червь"). [править: упс, я ошибаюсь, именно здесь я думал о «А» , начинающемся с предложения.]

Надеюсь, это полезно!

...