1 (изменено: Clannad5, 2021-12-18 17:53:09)

Тема: AHK: RegExMatch найти все ники

Есть переменная:


NickList = [05:21:33] [Client thread/INFO]: [CHAT] __Name__, Name2, RandomNike

есть условие:
- Никнеймы всегда разные.
- Количество ников может быть 1, а может быть 10 и выше.
- Время вначале всегда разное.
- строчка " [Client thread/INFO]: [CHAT] " статична и не меняется.

Как мне найти все ники и записать их в Match1, Match2 и тд с помощью команды RegExMatch()?
Заранее благодарю.

2 (изменено: Phoenixxx_Czar, 2021-12-18 09:06:00)

Re: AHK: RegExMatch найти все ники

А как понять, что это перечисление ников, а не обычное сообщение?

Не уверен, что с помощью RegExMatch можно получить именно то, что вы хотите. Так можно получить массив ников:

NickList = [05:21:33] [Client thread/INFO]: [CHAT] __Name__, Name2, RandomNike
if (RegExMatch(NickList, "O)\[\d{2}:\d{2}:\d{2}\]\s+\[Client thread\/INFO\]:\s+\[CHAT\]\s+(?<message>.*)", match))
{
	nickListArr := strSplit(match.message, ", ")

	; Первые три ника
	msgbox, % nickListArr[1] " " nickListArr[2] " " nickListArr[3]
	
	; Выводим по одному нику
	for index, nick in nickListArr
	{
		msgbox, % nick
	}
}

Либо же получить тот результат, которвый вы хотите, но с такими данными же не удобно работать, зачем?

NickList = [05:21:33] [Client thread/INFO]: [CHAT] __Name__, Name2, RandomNike
if (RegExMatch(NickList, "O)\[\d{2}:\d{2}:\d{2}\]\s+\[Client thread\/INFO\]:\s+\[CHAT\]\s+(?<message>.*)", match))
{
	for index, nick in strSplit(match.message, ", ")
	{
		match%index% := nick
	}

	; Первые три ника
	msgbox, % match1 " " match2 " " match3
}
Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

3

Re: AHK: RegExMatch найти все ники

Clannad5, у нас разве правила форума поменялись?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

4 (изменено: Clannad5, 2021-12-18 17:55:22)

Re: AHK: RegExMatch найти все ники

teadrinker
Поправьте, пожалуйста, не особо понимаю о чем вы. Исправил где понял.

5

Re: AHK: RegExMatch найти все ники

Phoenixxx_Czar
А можете, пожалуйста, объяснить как работает это условие на конце Reg'а: (?<message>.*)

Можно ли об этом где-то прочесть?

6

Re: AHK: RegExMatch найти все ники

Clannad5 пишет:

Поправьте, пожалуйста, не особо понимаю о чем вы

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

Clannad5 пишет:

есть условие:

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

Clannad5 пишет:

- Никнеймы всегда разные.
- Количество ников может быть 1, а может быть 10 и выше.
- Время вначале всегда разное.
- строчка " [Client thread/INFO]: [CHAT] " статична и не меняется.

Как раз здесь точки в конце не обязательны, это список вариантов. Но есть специальный тег:

  • никнеймы всегда разные

  • количество ников может быть 1, а может быть 10 и выше

  • время вначале всегда разное

  • строчка " [Client thread/INFO]: [CHAT] " статична и не меняется

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7 (изменено: Phoenixxx_Czar, 2021-12-18 21:22:03)

Re: AHK: RegExMatch найти все ники

Clannad5 пишет:

Phoenixxx_Czar
А можете, пожалуйста, объяснить как работает это условие на конце Reg'а: (?<message>.*)

Можно ли об этом где-то прочесть?

'?<message>' - именнованая группа, то есть, вместо 'match1' будет 'matchmessage', это если не использовать 'O)' в начале регулярного выражения, но тогда лучше переменную 'match' назвать 'match_', чтобы получилось 'match_message'.
'.*' - любой текст.

Думаю тут можно почитать про группы: https://www.regular-expressions.info/refext.html.
А вот здесь про 'O)' (object mode): https://www.autohotkey.com/docs/misc/RegEx-QuickRef.htm.

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

8

Re: AHK: RegExMatch найти все ники

Может, просто вот так:

NickList := "[05:21:33] [Client thread/INFO]: [CHAT] __Name__, Name2, RandomNike"
while RegExMatch(NickList, "O)\w+(?=,|$)", m, m ? m.Pos + m.Len : 1)
   MsgBox, % m[0]
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder