Что нового

[RegExp] переформатировать текстовую строку в понятное для AutoIT выражение

Alex Bit

Новичок
Сообщения
24
Репутация
0
Пошу форумчан помоч в следующем.
Изночально мы имеем строку-
Код:
$sString = 'when (hand =99 or hand=44) and stilltoact>1 and stilltoact<8'

нужно ее перефармотировать в выражение понятное AutoIT
Код:
$when =($hand=99 or $hand=44) and $stilltoact>1 and $stilltoact<8

пробовал делать так -
Код:
$sString = 'when ( hand =99 or hand=44 ) and stilltoact >1 and stilltoact < 8'
$hand = 44
$stilltoact = 5
$aFunc = StringSplit($sString, ' ')

For $i = 1 To $aFunc[0]
    Execute('_' & $aFunc[$i] & '()')
Next

Func _stilltoact()
	$when =($hand=99 or $hand=44) and $stilltoact>1 and $stilltoact<8
    MsgBox(64, 'Func', $when)
EndFunc   ;==>_stilltoact

Func _hand()
    MsgBox(64, 'Func', '_hand')
EndFunc   ;==>_hand

вроде работает но проблема что текстовая строка не имеет изначально пробела перед словом hand и stilltoact не определяется из-за < >
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
Alex Bit
может так:

Код:
$sString = 'when ( hand =99 or hand=44 ) and stilltoact >1 and stilltoact < 8'
$hand = 44
$stilltoact = 5
$aFunc1 = StringRegExp($sString,'(^\w+?\b)(.*)$',3)
MsgBox(0, 'разделили', $aFunc1[0] &@CRLF&$aFunc1[1])
$aFunc1[1]=StringRegExpReplace($aFunc1[1], '\w+?[ ]*[=<>]', '$\0')
MsgBox(0, 'добавили $', $aFunc1[1])
Assign($aFunc1[0], Execute($aFunc1[1]))
MsgBox(0, 'Создали переменную и вычислили выражение в неё', $when)
 
Автор
A

Alex Bit

Новичок
Сообщения
24
Репутация
0
:beer:Огромное спасибо!!Код понятен и работает.Задача решена.
 
Автор
A

Alex Bit

Новичок
Сообщения
24
Репутация
0
:'( обнаружил маленькую прблемку.
Если в строку включить булевую переменную то код работает без определения этой переменной,например-
Код:
$sString = 'when ( hand =99 or hand=44 ) and stilltoact >1 and stilltoact < 8 and paironboard fold  forse'
Я думаю в этом случаее практичнее убрать из строки символы и выражения котрые не должны преабразовываться в переменную ,а затем символы и выражения вставить назад.А выражение FOLD FORSE в вычислениех не учавствует,оно приобретает значение когда переменная WHEN при вычисление присваеваеться значение TRUE.Хотя может я ошибаюсь и есть более простое решение.
 
Автор
A

Alex Bit

Новичок
Сообщения
24
Репутация
0
Пытался включать свои мозги :wacko:.Не помогает.Видимо усохли.Прошу еще подсказок,в каком направлении двигаться .Пробовал всяко - получается лажа.Помогите пожалуйста.
 
Автор
A

Alex Bit

Новичок
Сообщения
24
Репутация
0
Код:
$aFunc1[1]=StringRegExpReplace($aFunc1[1], '(?i)\w+[A-Za-z]', '$\0')
как сделать что-бы знак $ не добавлялся к выражениям and or not ?
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
Alex Bit
Нужно прочитать справку по регулярным выражением
(?i) - без учёта регистра, но диапазон \w+[A-Za-z] охватывает нижний и верхний регистр.
Метасимвол \w+ включает диапазон A-Za-z0-9 или требуется последний символ не число?
Можно вторым регулярным выражением удалить символы $ перед указанными and or not.
\$(and|or|not) заменить на \1
 
Автор
A

Alex Bit

Новичок
Сообщения
24
Репутация
0
Код:
$aFunc1[1]=StringRegExpReplace($aFunc1[1], '\w+[A-Za-z]', '$\0')
$aFunc1[1]=StringRegExpReplace($aFunc1[1], '\$(and|or|not)', '\1')
Спасибо большое.Так вроде нормально работает.По поводу справки я ее читаю регулярно.Пока читаю - понятно.Перехожу к практики - уже и не понятно как реализовать(видимо возраст подводит).Как говорится "Не могу настроить свой мозг думать регулярными выражениями" .Еще отниму не много вашего внимания.
Почему в первой регулярке \0 а во второй \1
И подскажи пожалуйста как какой нибудь переменной присвоить значение перед словом forse ( forse постоянно ,меняется предыдущее слово в данном случае fold ) ,а из строки вообще убрать эти слова
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
Alex Bit
Вот утилита RegExp для теста регулярных выражений, в комплекте справка в виде html-файла. Не вижу смысла переписывать её сюда.

По второму вопросу нужен точный алгоритм, я не понял к примеру что делать со словом paironboard. Меняется ли количество слов после последнего and.
 
Автор
A

Alex Bit

Новичок
Сообщения
24
Репутация
0
Спасибо за ссылочку. Понравились выкладки. Респект и уважение.
Есть участок кода
Код:
$totalinvested = 150
$stacksize = 300
$haveoverpair = True
$hand = 99
$sString = 'when haveoverpair and (hand=99 or hand=44) and totalinvested > 120% stacksize raisemax force'
из $sString мы регулярками преврощаем в
Код:
$when = $haveoverpair and ($hand=99 or $hand=44) and $totalinvested > 120% $stacksize

При этом "raisemax force" не учавствует в вычислениях.
Если с этим
Код:
$when = $haveoverpair and ($hand=99 or $hand=44)
участком все понятно , то здесь не очень
Код:
$totalinvested > 120% $stacksize
из этого участка мы должны сделать ?
Код:
($totalinvested > $stacksize / 100 * 120)

Затем самое интересное - есле переменная $when = True то переменная $force = ' raisemax' или другое строковое слово стоящее перед словом force :scratch:
 
Верх