Небольшой вопросик в коде

Помощь в написании скриптов для игр.
Vladik2304
Posts: 24
Joined: 20 Jan 2022, 15:58

Небольшой вопросик в коде

06 May 2022, 14:56

RegexMatch(A_LoopField,
Last edited by Vladik2304 on 07 May 2022, 08:46, edited 2 times in total.
mcl
Posts: 361
Joined: 04 May 2018, 16:35

Re: Небольшой вопросик в коде

06 May 2022, 15:52

Vladik2304 wrote:
06 May 2022, 14:56
Подскажите, почему этот код находит id через раз. Т.е. он не всегда находит число в [ ]
Ниже прикрепил скрин из чата и код
Attachments
IMG_20220506_234345.jpg
IMG_20220506_234345.jpg (216.4 KiB) Viewed 1113 times
Vladik2304
Posts: 24
Joined: 20 Jan 2022, 15:58

Re: Небольшой вопросик в коде

06 May 2022, 16:16

mcl wrote:
06 May 2022, 15:52
Vladik2304 wrote:
06 May 2022, 14:56
Подскажите, почему этот код находит id через раз. Т.е. он не всегда находит число в [ ]
Ниже прикрепил скрин из чата и код
Предоставил чатлог файлом ниже.
Отвечу сразу на вопрос: "Что будет делать код если не будет найден id", надо чтобы просто через AddChatMessage вывод "id не найден"
Last edited by Vladik2304 on 07 May 2022, 08:45, edited 1 time in total.
mcl
Posts: 361
Joined: 04 May 2018, 16:35

Re: Небольшой вопросик в коде

06 May 2022, 19:39

Code: Select all

FileRead, Str, chatlog.txt

rx =                  ; Регулярное выражение разбито на части для упрощения понимания
( Join LTrim Comments
  m)                  ; Флаг m (multi-line) упрощает работу с многострочными текстами
  ^                   ; Символ ^ - начало строки (с флагом m - любой строки, а не всего текста)
  \[\d\d:\d\d:\d\d\]  ; Метка времени в формате [NN:NN:NN], где N - любое число
  \s*                 ; Пробелы после метки времени (похоже, обычно один, но мало ли что)
  \S+_\S+             ; Имя в формате ТЕКСТ_ТЕКСТ; \S - не-пробелы (например, буквы)
  \[(\d+)\]           ; Числовой Id в квадратных скобках. Круглые скобки - для записи в match1
  \s:\s               ; Пробел-двоеточие-пробел, разделяющие автора сообщения и его текст
  .*                  ; Текст сообщения, совершенно любой.
  $                   ; Конец строки (как и ^, зависит от флага m)
)

RegexMatch(Str, rx, match)

If (match1 == "") {
	MsgBox ID не найден   ; AddChatMessage("ID не найден")
	Return
}

MsgBox % match1
; остальной код
Подсветка кода тут несколько страдает, но на работоспособность это влиять не должно.
Флаг m позволяет избавиться от команд StringReplace и возни с переносами строк (`n)

Если этот скрипт запустить в той же папке, что и chatlog.txt, он выдаёт id из сообщения первого найденного игрока. Но есть важные моменты:

1. Выдаётся id простого игрока, не администратора. В сообщениях администраторов между меткой времени и именем стоит статус ([00:00:00] Администратор Иван_Иванов[1]), а по регулярке после метки времени сразу должно идти имя.

2. Выдаётся id только для публичных сообщений. Например, Петр_Петров[2] для Семен_Семенов[3] будет пропущено, так как по регулярке после имени и id должно сразу идти двоеточие и текст сообщения.

3. Текст сообщения может быть любым. В вашем исходном коде в тексте сообщения должна была быть хотя бы одна цифра − не знаю, зачем.

Соответственно, для достижения желаемого результата, вероятно, придётся подправить те или иные части регулярки.

Return to “Скрипты для Игр”

Who is online

Users browsing this forum: No registered users and 8 guests