Замените смайлики соответствующим кодом Java.

Я работаю над простой java-программой, которая может принимать такую ​​строку:

⛔️????✋СТОП✋????⛔️ ????Вы нарушили ???????? закон!???? ????????Но теперь...???????? ????Вы

и замените каждый смайлик соответствующим символом Java. (не знаю как их назвать).

Вот пример:

Автомобильный смайлик: ???? будет заменен на: «������».

Это позволяет мне иметь строку, например

"I am a car: \uD83D\uDE97"

в исходном коде Java, и пусть это выглядит так:

введите здесь описание изображения

Итак, вопрос в том, как я могу автоматически найти определенный смайлик в строке (например, найти каждый смайлик красного автомобиля в строке) и заменить его соответствующим «символом Java»?

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

Ничего себе, оказалось очень просто. я мог бы просто сделать

string.replace("????","Java code");

person Roymunson    schedule 22.04.2016    source источник
comment
Подумайте о том, чтобы написать свой собственный ответ / отметить чужой ответ как правильный, поскольку проблема решена.   -  person Sanchit    schedule 22.04.2016


Ответы (3)


Для этого следует использовать следующий метод:

public String replaceAll (регулярное выражение строки, замена строки)

См. документация.

Пример:

source
.replaceAll("????", "value")
.replaceAll("????", "nextValue")

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

Map<String, String> mappedChars = new HashMap<>();
mappedChars.put("A", "valueForA");
mappedChars.put("B", "valueForB");

AtomicReference<String> value = new AtomicReference<>("A and B and C");

mappedChars
        .entrySet()
        .stream()
        .forEach(entry -> value.getAndUpdate(current -> current.replaceAll(entry.getKey(), entry.getValue())));

//valueForA and valueForB and C
person Ioan    schedule 22.04.2016
comment
То, как это написано, на самом деле не обязательно должно быть картой. (Вы вообще не используете быстрый поиск.) Но я думаю, что карта в любом случае является неоптимальной структурой для этой задачи. Это может быть нормально, если количество кодовых точек на смайлик всегда равно 1, но в общем случае вам, вероятно, понадобится что-то вроде поиска Ахо-Корасика по кодовым точкам, потому что некоторые смайлики состоят из нескольких кодовых точек. - person Trejkaz; 16.03.2018

Имейте в виду, что не все кодировки могут обрабатывать эти строки. Вы можете передать строку в массив байтов, проанализировать ее и преобразовать обратно в строку.

person Giovanni    schedule 22.04.2016

Это символы Юникода. Найти их и заменить на самом деле разные задачи.

Поиск символов Юникода в строке — непростая задача. Один из способов — просто применить indexOf к вашей строке, чтобы найти начало символа Юникода.

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

int unicodeCharacterLocation = Str.indexOf("\\u")

if (Character.isDigit(Str.charAt(unicodeCharacterLocation + 1)))
{
    if (Character.isDigit(Str.charAt(unicodeCharacterLocation + 2)))
    {
        if (Character.isDigit(Str.charAt(unicodeCharacterLocation + 3)))
        {
            if (Character.isDigit(Str.charAt(unicodeCharacterLocation + 4)))
            {
                //You may have found a unicode character
            }
        }
    }
}

Это может быть установлено в цикле, чтобы найти все символы Юникода.

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

person Scott Forsythe    schedule 22.04.2016