1 (изменено: cahtbap1, 2017-05-10 16:43:58)

Тема: AHK: Разделение 1 переменной на несколько

Задумка в том чтоб вводить в gui строку , включая нужные мне части в ♦♦ (нечто похожее на скобки ,наличие которых не обязательно) , а скрипт анализировал их и по одной вводил при этом иное в переменные.
К примеру 1♦2♦3♦4♦5 преобразовалось в a=1 , b=2 , c=3♦4♦5 (вводимая строка произвольный набор данных).
Адскими муками набил вот такой код:


x=123♦100♦223♦2222♦324
StringReplace, _, x, ♦,, UseErrorLevel
e:=Mod(errorlevel,2)
if e = 1
	return
gosub c1
MsgBox,%a%`n%b%`n%c%
return
c1:
a:=RegExReplace(x,"♦.*","")
c:=RegExReplace(x,a "♦","")
b:=RegExReplace(c,"♦.*","")
c:=RegExReplace(c,b "♦","")
return

Есть ли иной способ разделить переменную на "до 1 знака" , между "1 и 2 знаком" , и "после 2 знака" , либо эффективнее использовать шаблоны?
Здесь же с шаблоном ".*" возникла проблема - ".*" берет в себя максимальное количество знаков , а StartingPosition почему-то бессилен .
Если можно помогите сделать это в стиле analyze(x) => a=1 , b=2 , c=3♦4♦5.

2

Re: AHK: Разделение 1 переменной на несколько

То есть Вам нужно разделить строку на три части:

  1. всё что до первого ♦

  2. от первого ♦ до второго ♦

  3. всё что после второго ♦,

верно?

3

Re: AHK: Разделение 1 переменной на несколько

ypppu
Да , верно.

4 (изменено: cahtbap1, 2017-05-10 18:26:45)

Re: AHK: Разделение 1 переменной на несколько

Немного разобрался с функциями.


x=123♦100♦223♦2222♦324
StringReplace, _, x, ♦,, UseErrorLevel
e:=Mod(errorlevel,2)
if e = 1
	return
Get(a,b,c,x)
MsgBox,%a%`n%b%`n%c%
return
Get(ByRef a,ByRef b,ByRef c,ByRef x)
{
a:=RegExReplace(x,"♦.*","")
c:=RegExReplace(x,a "♦","")
b:=RegExReplace(c,"♦.*","")
c:=RegExReplace(c,b "♦","")
}

5 (изменено: Alectric, 2017-05-10 18:50:58)

Re: AHK: Разделение 1 переменной на несколько

x=123¦100¦223¦2222¦324
RegExMatch(x,"([^¦]*)¦([^¦]*)¦(.*)", find)
msgbox,% find1 "`n" find2 "`n" find3 "`n"
cahtbap1 пишет:

Get(ByRef a,ByRef b,ByRef c,ByRef x)

Для X ByRef не нужен.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

6

Re: AHK: Разделение 1 переменной на несколько

Спасибо.

Alectric пишет:

Для X ByRef не нужен.

Почему нет?

7 (изменено: Alectric, 2017-05-10 19:06:19)

Re: AHK: Разделение 1 переменной на несколько

Чтобы случайно не изменить исходные данные. Если они потребуются в дальнейшем.

a=10

f1(a)
msgbox,% a
f2(a)
msgbox,% a



f1(a)
{
  a=20
}

f2(byref a)
{
  a=20
}

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

8 (изменено: cahtbap1, 2017-05-10 19:48:08)

Re: AHK: Разделение 1 переменной на несколько

Alectric пишет:

Чтобы случайно не изменить исходные данные. Если они потребуются в дальнейшем.

Понятно , а что еще я сделал не так?

y=`nyea{!}♦1000♦its working{! 5}♦700♦ITS WORKING{! 8}♦400♦`nTHANKS ALECTRIC{! 20}♦400♦`nTHANKS ALECTRIC{! 20}♦400♦`nTHANKS ALECTRIC{! 20}
print(y)
print(y)
return
print(x3)
{
if x3 not contains ♦
{
send,%x3%
return
}
StringReplace, _, x3, ♦,, UseErrorLevel
e:=Mod(errorlevel,2)
if e = 1
{
MsgBox Error♦
return
}
loop
{
RegExMatch(x3,"([^♦]*)♦([^♦]*)♦(.*)", x)
Send,%x1%
sleep,%x2%
if x3 not contains ♦
{
Send, %x3%
return
}
}
}

9 (изменено: Alectric, 2017-05-10 20:02:14)

Re: AHK: Разделение 1 переменной на несколько

Пренебрёг форматированием, и твой код тяжело прочитать.

Решается в пару пробелов:

print(x3)
{
  if x3 not contains ¦
  {
    send,%x3%
    return
  }
  StringReplace, _, x3, ¦,, UseErrorLevel
  e:=Mod(errorlevel,2)
  if e = 1
  {
    MsgBox Error¦
    return
  }
  loop
  {
    RegExMatch(x3,"([^¦]*)¦([^¦]*)¦(.*)", x)
    Send,%x1%
    sleep,%x2%
    if x3 not contains ¦
    {
      Send, %x3%
      return
    }
  }
}
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

10

Re: AHK: Разделение 1 переменной на несколько

Alectric
Хах , а кроме?

11

Re: AHK: Разделение 1 переменной на несколько

Да вроде больше ничего.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

12

Re: AHK: Разделение 1 переменной на несколько

И тут вы со своими регекспами. Тут они абсолютно не нужны.

var := [], varsString := "1♦45♦33♦4♦95"
Loop parse, varsString, ♦
	var[A_Index] := A_LoopField

MsgBox % var[3]

13

Re: AHK: Разделение 1 переменной на несколько

Функцией:

varsString := "1♦45♦Hello world!♦4♦95"
varArr := ParseString♦(varsString)
MsgBox % varArr[3]

ParseString♦(super_string) {
	arr := []
	Loop parse, super_string, ♦
		arr[A_Index] := A_LoopField
	Return arr
}

14

Re: AHK: Разделение 1 переменной на несколько

Off:
stealzy, чего эт ты так протестуешь то? Не хочешь об этом поговорить?

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

15

Re: AHK: Разделение 1 переменной на несколько

Ну просто не любитель гвозди стаместкой забивать. Тем более когда молоток под рукой.
КМК, код без RegEx проще для понимания и маштабирования.

16 (изменено: Alectric, 2017-05-11 17:23:37)

Re: AHK: Разделение 1 переменной на несколько

Off:
Каждому своё. Многие любят "гвозди стаместкой забивать". Да и вообще все эти компьютерные технологии...

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

17

Re: AHK: Разделение 1 переменной на несколько

Alectric, stealzy, пора прекращать оффтопить.