Разделение строки с помощью Emoji Regex с уважением к селектору вариаций 15 - PullRequest
1 голос
/ 22 января 2020

Я пытаюсь создать способ разбить строку по смайликам и не-смайликам. Мне удалось получить регулярное выражение из здесь и изменить его, чтобы учесть селектор текстового варианта:

(?:(?!(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])+\ufe0e))(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])+

Это работает с .match, например:

'??'.match(regex) // (["0x1F1E6", "0x1F1E8"]) => ['??']
'??'.match(regex) // (["0x1F1E6", "0x1F1E8", "0xFE0E]) => null

Но split не дает мне ожидаемых результатов:

'??'.split(regex) // (["", undefined, "?", ""]) => ['??']

Мне нужно split, чтобы вернуть все смайлики в одном элементе. Что я делаю не так?

РЕДАКТИРОВАТЬ:

У меня есть рабочее регулярное выражение, за исключением показанного здесь крайнего случая: https://regex101.com/r/Vki2ZS/2.

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

1 Ответ

1 голос
/ 24 января 2020

Ваш паттерн не работает, потому что второй эмодзи был частично сопоставлен с (?:\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])+ количественно *1002*: \uD83E\uDD20\uFE0F\uD83E\uDD20 сопоставлено в \uD83E\uDD20\uFE0F\uD83E\uDD20\uFE0E с двумя итерациями, сначала \uD83E\uDD20\uFE0F, затем \uD83E\uDD20.

Шаблон, который вы можете использовать с .split - это

/((?:(?:\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])+(?!\ufe0e)(?:\ufe0f)?(?:\u200d)?)+)/

Основная цель состояла в том, чтобы провалить все матчи, где за (?:\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])+ последовало \uFE0E, смотрите, я добавил отрицательный прогноз (?!\ufe0e).

JS демо:

var regex = /((?:(?:\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])+(?!\ufe0e)(?:\ufe0f)?(?:\u200d)?)+)/;
console.log('??'.split(regex));
console.log('?️?︎'.split(regex));

// If you need to wrap the match with some tags:
console.log('?️?︎'.replace(/(?:(?:\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])+(?!\ufe0e)(?:\ufe0f)?(?:\u200d)?)+/g, '<span class="special">$&</span>'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...