Автор Тема: [RegExp] переформатировать текстовую строку в понятное для AutoIT выражение  (Прочитано 6217 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Alex Bit [?]

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

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

пробовал делать так -
Код: AutoIt [Выделить]
$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 не определяется из-за <  >

« Последнее редактирование: Май 20, 2011, 11:52:20 от CreatoR »

Русское сообщество AutoIt


Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2738
  • Репутация: 1143
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
Alex Bit
может так:

Код: AutoIt [Выделить]
$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)


Оффлайн Alex Bit [?]

  • Новичок
  • *
  • Сообщений: 24

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

Русское сообщество AutoIt


Оффлайн Alex Bit [?]

  • Новичок
  • *
  • Сообщений: 24

  • Автор темы
  • Репутация: 0
    • Награды
 :'( обнаружил маленькую прблемку.
Если  в строку включить булевую переменную то код работает без определения этой переменной,например-
Код: AutoIt [Выделить]
$sString = 'when ( hand =99 or hand=44 ) and stilltoact >1 and stilltoact < 8 and paironboard fold  forse'

Я думаю в этом случаее практичнее убрать из строки символы и выражения котрые не должны преабразовываться в переменную ,а затем символы и выражения вставить назад.А выражение FOLD FORSE в вычислениех не учавствует,оно приобретает значение когда переменная WHEN при вычисление присваеваеться значение TRUE.Хотя может я ошибаюсь и есть более простое решение.

Оффлайн Alex Bit [?]

  • Новичок
  • *
  • Сообщений: 24

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

Русское сообщество AutoIt


Оффлайн Alex Bit [?]

  • Новичок
  • *
  • Сообщений: 24

  • Автор темы
  • Репутация: 0
    • Награды
Код: AutoIt [Выделить]
$aFunc1[1]=StringRegExpReplace($aFunc1[1], '(?i)\w+[A-Za-z]', '$\0')

как сделать что-бы знак $ не добавлялся к выражениям and or not ?

Оффлайн AZJIO [?]

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

Оффлайн Alex Bit [?]

  • Новичок
  • *
  • Сообщений: 24

  • Автор темы
  • Репутация: 0
    • Награды
Код: AutoIt [Выделить]
$aFunc1[1]=StringRegExpReplace($aFunc1[1], '\w+[A-Za-z]', '$\0')
$aFunc1[1]=StringRegExpReplace($aFunc1[1], '\$(and|or|not)', '\1')

Спасибо большое.Так вроде нормально работает.По поводу справки я ее читаю регулярно.Пока читаю - понятно.Перехожу к практики -  уже и не понятно как реализовать(видимо возраст подводит).Как говорится "Не могу настроить свой мозг думать регулярными выражениями" .Еще отниму не много вашего внимания.
Почему в первой регулярке \0 а во второй \1
И подскажи пожалуйста как какой нибудь переменной присвоить значение перед словом forse ( forse постоянно ,меняется предыдущее слово в данном случае fold ) ,а из строки вообще убрать эти слова

Русское сообщество AutoIt


Оффлайн AZJIO [?]

  • VIP
  • *
  • Сообщений: 2738
  • Репутация: 1143
    • мой сайт
    • Награды
  • Версия AutoIt: 3.3.8.1
Alex Bit
Вот утилита RegExp для теста регулярных выражений, в комплекте справка в виде html-файла. Не вижу смысла переписывать её сюда.

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

Оффлайн Alex Bit [?]

  • Новичок
  • *
  • Сообщений: 24

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

из $sString мы регулярками преврощаем в
Код: AutoIt [Выделить]
$when = $haveoverpair and ($hand=99 or $hand=44) and $totalinvested > 120% $stacksize

При этом "raisemax force" не учавствует в вычислениях.
Если с этим
Код: AutoIt [Выделить]
$when = $haveoverpair and ($hand=99 or $hand=44)

участком все понятно , то здесь не очень
Код: AutoIt [Выделить]
$totalinvested > 120% $stacksize

из этого участка мы должны сделать ?
Код: AutoIt [Выделить]
($totalinvested > $stacksize / 100 * 120)

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

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
1 Ответов
4599 Просмотров
Последний ответ Июнь 20, 2010, 07:20:35
от gregaz
23 Ответов
15986 Просмотров
Последний ответ Сентябрь 25, 2010, 10:42:18
от Kaster
10 Ответов
8450 Просмотров
Последний ответ Июнь 22, 2011, 19:36:26
от Alex Bit
3 Ответов
3114 Просмотров
Последний ответ Октябрь 04, 2011, 10:16:20
от gregaz
8 Ответов
5055 Просмотров
Последний ответ Ноябрь 30, 2011, 04:57:24
от -ZIG-ZAG-
5 Ответов
6214 Просмотров
Последний ответ Январь 13, 2012, 16:08:00
от BaRsupillamy
14 Ответов
7131 Просмотров
Последний ответ Июль 03, 2012, 00:48:36
от Garrett
5 Ответов
1368 Просмотров
Последний ответ Апрель 18, 2016, 15:17:16
от babanty
5 Ответов
1242 Просмотров
Последний ответ Март 04, 2017, 08:02:15
от reset86
10 Ответов
1315 Просмотров
Последний ответ Ноябрь 17, 2017, 16:29:32
от Ed_Vard