Обнаружить все смайлики с помощью регулярных выражений в Lua/PCRE/OpenResty

У меня есть регулярное выражение JavaScript, которое соответствует эмодзи. Как сопоставить одинаковые символы с помощью ngx.re.match(), который является частью библиотеки OpenResty для веб-сервера nginx.

Это оригинальное регулярное выражение для сопоставления смайликов в JS:

(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])

person Dzmitry    schedule 08.04.2019    source источник
comment
@vahdet есть два разных вопроса! Я не использую С++.   -  person Dzmitry    schedule 08.04.2019
comment
Использование жестко закодированных кодовых точек обязательно сломается. Используйте вместо этого свойства Unicode.   -  person Patrick Mevzek    schedule 08.04.2019
comment
Обратите внимание, что [\ud000-\udfff] не имеет смысла. Должно быть [\udc00-\udfff]   -  person ikegami    schedule 08.04.2019


Ответы (1)


В PCRE \x{####} можно использовать как эквивалент \u#### в JavaScript.

Во-вторых, шаблон JavaScript предназначен для сопоставления с кодовыми точками, закодированными с использованием UTF-16. Но поскольку мы будем сопоставлять сами кодовые точки в PCRE, нам нужно «декодировать» суррогатные пары.

После внесения обоих изменений получаем:

[\xA9\xAE\x{2000}-\x{3300}\x{1F000}-\x{1FBFF}]

(Я не знаю Lua, поэтому я оставлю его для предоставления строкового литерала, который создает эту строку.)

Обратите внимание, что ваш шаблон соответствует больше, чем то, что большинство людей считают смайликами. Смайлики находятся в блоке «Смайлики». Этот блок (в настоящее время) охватывает кодовые точки от U+1F600 до U+1F64F. В Perl вы можете использовать \p{Block=Emoticons} или даже просто \p{Emoticons}, чтобы сопоставить их, но они, похоже, не поддерживаются PCRE. Поэтому, чтобы соответствовать только смайликам, вы должны использовать следующее:

[\x{1F600}-\x{1F64F}]
person ikegami    schedule 08.04.2019