Помогите с regexp

14
0
Нужно выловить сообщение и найти там ник игрока, для этого сделал паттерн, разделил его на 3 группы (ник запросчика, сообщение, ник который нужно найти)
Пишу на Forge 1.12.2
Java:
if (event.getMessage().getUnformattedText().toLowerCase().contains("ник игрока ")){
            String plr = "<(.+)> ([н].+[а]) (.+)";
            String lpr = event.getMessage().getUnformattedText();
            Pattern pattern = Pattern.compile(plr);
            Matcher matcher = pattern.matcher(lpr);
            Minecraft.getMinecraft().player.sendChatMessage("Получен ник: " + matcher.group(3));
        }
// Изначальная строка "<Player> ник игрока Player_1337"
Но при запросе в игре ошибка "java.lang.IllegalStateException: No match found"
С чем это может быть связанно? Проверил через сайт всё должно находиться 1636881672724.png
Еще выводил просто event.getMessage().getUnformattedText() - строка как на скрине
 
Ну... это выглядит так, будто готово упасть при любом сообщении, которое содержит только "ник игрока ".
 
Просто дело в том что мне нужно узнать ник Player_1337, а ник запросчика может меняться разными префиксами, и тут уже не угадать индекс, вспомогательных символов же рядом нету, кроме как заставлять запросчика писать вопрос в конце без пробела. А через паттерн можно было бы находить группу с ником
 
Из каких тебе нужно конкретно сообщений выдирать ник?
 
Есть строка в чате "[G] (Клан) [Префикс] Ник (Доп. суф.) -> сообщение Player_1337"
И есть второй вариант с получением ника отправителя для написания ему в лс сообщения
"[G] (Клан) [Префикс] Player_1337 (Доп. суф.) -> сообщение"
Из этой строки нужно взять ник "Player_1337" для дальнейшего использования
Проблема в том что длина клана/префикса/суффикса/ника у всех игроков разная
 
Последнее редактирование:
А что отличает ник, что нужно выдернуть от фрагмента "сообщение"?

Если тебе уж нужно просто выдернуть последнее слово как нит, то используй chatMessage.split() и бери последний элемент массива как нужный результат. Но только сделай проверку, что это сообщение от игрока (например, что оно начинается с [G])
 
А что насчёт варианта про получения ника отправителя? Там может и не быть клана
 
Что тебе нужно? 2 ника и чтоб из сообщения ник который ты написал был убран?
 
Java:
private static final int minLengthOfPlayerName = 4;

    @SubscribeEvent
    public void serverChat(ServerChatEvent event) {
        EntityPlayerMP otherPlayerMP = null;
        String message = event.getMessage();
        String[] divides = message.split(" ");
        for(String name : divides) {
            if(name.length() >= minLengthOfPlayerName) {
                otherPlayerMP = ServerUtils.getPlayerMPByName(name);
                if(otherPlayerMP != null) break;
            }
        }
        if(otherPlayerMP != null) {
            String myName = event.getUsername();
            message = message.replace(String.format(" %s", otherPlayerMP.getName()), "");
            String otherName = otherPlayerMP.getName();

            System.out.print("Мой ник: " + myName + "\n");
            System.out.print("Сообщение: " + message + "\n");
            System.out.print("Ник игрока: " + otherName + "\n");
        }
    }
Java:
public static EntityPlayerMP getPlayerMPByName(String name){
        Iterator<EntityPlayerMP> iterator = FMLCommonHandler.instance().getMinecraftServerInstance().getPlayerList().getPlayers().iterator();
        while(iterator.hasNext()){
            EntityPlayerMP player = iterator.next();
            if(player.getName().equals(name))
                return player;
        }
        return null;
    }
 

Вложения

  • tt1.png
    tt1.png
    18 KB · Просмотры: 22
  • tt2.png
    tt2.png
    27.4 KB · Просмотры: 22
Последнее редактирование:
Назад
Сверху