NSPredicate с регулярным выражением для соответствия международному набору буквенных символов

#regex #cocoa-touch #cocoa

#регулярное выражение #cocoa-touch #cocoa

Вопрос:

Я пытаюсь проверить строку, представляющую название места. Я сопоставляю простой набор символов, подобный этому

 NSString *regexName = @"[a-zA-Z][., a-zA-Z\t\-]*"
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regexName];
  

Я хотел бы знать простое регулярное выражение, которое можно использовать для сопоставления с более широким международным набором символов (в основном западными символами). Я мог бы просто перечислить каждый символ, который я могу придумать внутри регулярного выражения, но я полагаю, что есть другой способ. Я ищу идеи.

Ответ №1:

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

То, что вы ищете, — это свойство Letter, которое кодируется как p{Letter} (или для краткости, p{L} ).

Вот некоторый код для тех, кто хочет увидеть это на практике:

 NSArray *strings = [NSArray arrayWithObjects:
                           @"Joe",
                           @"Chloë",
                           @"Søren",
                           @"Renée",
                           @"Se7en",
                           @"Zürich",
                           @"Genève",
                           @"Tromsø",
                           @"Jane",
                           nil];

NSString *regexName = @"\p{Letter}[., \p{Letter}\t\-]*";

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regexName];

NSArray *filteredArray = [strings filteredArrayUsingPredicate:predicate];
  

Он сопоставляет все имена с буквами, но не строку «Se7en».

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