Эмодзи NSTextStorage

В настоящее время я работаю над пользовательским NSTextStorage на iOS, мне нужно обнаружить некоторые хэштеги (#), упоминания и URL-адреса... На данный момент все работает нормально, но если пользователь пытается ввести символ смайликов с клавиатуры, он не отображается , потому что я использую шрифт Helvetica.

Я использую регулярное выражение для обнаружения хэштегов, упоминаний и URL-адресов следующим образом:

NSRegularExpression *iExpression = [NSRegularExpression regularExpressionWithPattern:pattern
                                                                             options:0
                                                                               error:NULL];

NSRange paragraphRange = [self.string paragraphRangeForRange: self.editedRange];        

[iExpression enumerateMatchesInString:self.string
                              options:0
                                range:paragraphRange
                           usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop)
{
    // Changing format of match
}

Где pattern — допустимый шаблон регулярного выражения для поиска хэштегов, URL-адресов или упоминаний.

Есть ли какой-то шаблон для обнаружения символов смайликов? какой шаблон мне использовать, я пробовал это (и многие другие) [^\\x{1F601}-\\x{1F64F}\r\n]безуспешно.

Спасибо.


person D33pN16h7    schedule 13.08.2014    source источник
comment
Я надеюсь, что мой ответ поможет вам.   -  person Gabriel.Massana    schedule 27.01.2016


Ответы (1)


Я не уверен в шаблонах регулярных выражений программирования iOS, но в чем я уверен, так это в том, что хотя вы указываете на правильный диапазон, вы исключаете набор символов, а не включаете, используя знак вставки ^ в определении набора символов [] . Также я не думаю, что вам нужно избегать этих шестнадцатеричных точек и сопоставлять CR и LF.

Существует полная таблица Unicode эмодзи, состоящая из соответствующих точек Unicode здесь, которую я собрал в однострочное выражение ниже:

([0-9#][\x{20E3}])|[\x{00ae}|\x{00a9}|\x{203C}|\x{2047}|\x{2048}|\x{2049}|\x{3030}|\x{303D}|\x{2139}|\x{2122}|\x{3297}|\x{3299}][\x{FE00}-\x{FEFF}]?|[\x{2190}-\x{21FF}][\x{FE00}-\x{FEFF}]?|[\x{2300}-\x{23FF}][\x{FE00}-\x{FEFF}]?|[\x{2460}-\x{24FF}][\x{FE00}-\x{FEFF}]?|[\x{25A0}-\x{25FF}][\x{FE00}-\x{FEFF}]?|[\x{2600}-\x{27BF}][\x{FE00}-\x{FEFF}]?|[\x{2900}-\x{297F}][\x{FE00}-\x{FEFF}]?|[\x{2B00}-\x{2BF0}][\x{FE00}-\x{FEFF}]?|[\x{1F000}-\x{1F6FF}][\x{FE00}-\x{FEFF}]?

В варианте PCRE включение флага UTF-16 является обязательным, введя u в части модификаторов, чтобы соответствовать символам Unicode, поэтому это будет /ABOVE-EXPRESSION/u, но, к сожалению, я не знаю, как это делается в вашем конкретном случае.

person revo    schedule 21.05.2015