1 (изменено: Phoenixxx_Czar, 2019-03-26 23:00:04)

Тема: AHK: Деление строки по словами

Давненько делал себе функцию, которая делит строку по словам. Хотелось бы ее как-то оптимизировать чтоль.

splitStringLimit(text, limit)
{
	out := []
	index := 1

	if text Contains % "``n"
	{
		for k, v in StrSplit(text, "``n")
		{
			for key, value in splitStringLimit(v, limit)
				out[index] := value, index++
		}
		return out
	}

	for k, v in StrSplit(text, A_Space)
	{
		if (A_Index == 1)
			out[index] := v
		Else
		{
			if (StrLen(out[index] " " v) <= limit)
				out[index] .= " " v
			Else
				index++, out[index] := v
		}
	}
	return out
}
Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

2

Re: AHK: Деление строки по словами

Я не понял, что делает limit:

obj := splitStringLimit("C:\Program Files\AutoHotkey\AutoHotkey.exe /ErrorStdOut D:\OneDrive\Scripts\_Разработка\New7.ahk", 1)
for k, v in obj
   MsgBox, % v

splitStringLimit(text, limit)
{
   out := []
   index := 1

   if text Contains % "``n"
   {
      for k, v in StrSplit(text, "``n")
      {
         for key, value in splitStringLimit(v, limit)
            out[index] := value, index++
      }
      return out
   }

   for k, v in StrSplit(text, A_Space)
   {
      if (A_Index == 1)
         out[index] := v
      Else
      {
         if (StrLen(out[index] " " v) <= limit)
            out[index] .= " " v
         Else
            index++, out[index] := v
      }
   }
   return out
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: Phoenixxx_Czar, 2019-03-26 23:34:44)

Re: AHK: Деление строки по словами

Есть предложение/строка, допустим она длинной 350 символов, а нам нужно разделить эту большую строку по 80 символов. Данная функция именно для этого. (Она не обрезает слова, именно для этого там сплит строки по пробелам.)

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

4 (изменено: Phoenixxx_Czar, 2019-03-26 23:39:15)

Re: AHK: Деление строки по словами

str := "Lorem ipsum dolor sit amet consectetur, adipisicing elit. Quaerat placeat consequatur itaque quia explicabo magnam molestias! Rerum mollitia dolores suscipit. Alias cupiditate nesciunt doloribus, eaque sint quaerat sed, ullam unde non architecto soluta exercitationem. Aperiam facere, dolorum molestias ipsum illo expedita earum cupiditate, alias exercitationem quas iure recusandae nobis quidem!"
for k, v in splitStringLimit(str, 80)
	msgbox, % v
Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

5 (изменено: belyankin12, 2019-03-27 00:15:27)

Re: AHK: Деление строки по словами

Когда у меня была задача вывести на экран пользователя все команды которые доступны для его ввода (командный процессор с СМма) я сделал вот так:


for k in CMD.List {
	if (A_Index = 1) {
		str .=  k 
	} else {
		str .= ", " k ""
	}
}
		
sarr := StrSplit(str, ", ")
for k, v in sarr {
	if (A_Index = 1) {
		st .= "Доступные команды: " v ""
		continue
	}
	
	if (Strsplit(st).MaxIndex() + Strsplit(v).MaxIndex() <= 120) {
		st .= ", " v ""
	} else {
		addmessagetochatwindow2("{ff0000}", "[AHK]: {FFFAFA}" . st . "")
		st := ""
		st .= v
	}
}
addmessagetochatwindow2("{ff0000}", "[AHK]: {FFFAFA}" . st . ".")

Тоже давненько делал но выглядит вроде бы привлекательнее. Если добавить тернарных операторов, а каждый addmessagetochatwindow2 заменить на создание исходного массива то думаю будет нормально.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

6 (изменено: teadrinker, 2019-03-27 02:04:16)

Re: AHK: Деление строки по словами

str := "Lorem ipsum dolor sit amet consectetur, adipisicing elit. Quaerat placeat consequatur itaque quia explicabo magnam molestias! Rerum mollitia dolores suscipit. Alias cupiditate nesciunt doloribus, eaque sint quaerat sed, ullam unde non architecto soluta exercitationem. Aperiam facere, dolorum molestias ipsum illo expedita earum cupiditate, alias exercitationem quas iure recusandae nobis quidem!"
for k, v in splitStringLimit(str, 80)
   msgbox, % v

splitStringLimit(text, limit)
{
   out := []
   while RegExMatch(text, "xO)(?<=\s|^) ( ([^`r`n]){1," . limit . "} | (?2)+? ) (\s|$)", match, match ? match.Pos + match.Len : 1)
      out.Push(match[1])
   Return out
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Деление строки по словами

Это действительно круто получилось! Спасибо.

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