Page 1 of 1

Save found subexpressions

Posted: Thu Mar 15, 2018 7:50 pm
by crisp212
Good afternoon Oleg,

Two questions:

1)Dont understand the "first expression" and "last expression" from the "save parameters" in the "save found expressions" in "RegExp Match" does. What does it do one or another?

2)What is the best way to reset a variable value in a loop?

The problem is: I have a task, that you helped me to do, that runs every 1sec (cyclic) and checks emails in my account (IMAP mail LOOP) When it checks and finds the pattern "Alert in xxx/xxx" (regExp Match), it saves "xxxx/xxxx" into a subexpression (subexpr(1)) and sends me an email of the subexpression (send email). Example: Received email of "Alert in Madrid/Spain" and sends me email with subject "Madrid/Spain". Everything runs great. The thing is is that sometimes, once every 20 emails, it starts a loop that its always me sending me "Madrid/Spain" to my email instead of for example "London/England" or "Moscu/Russia" from a received email. Very rare times but it does start a loop.

Could be because I have selected "Last expression" instead of "First expression"?
Maybe should I put a "break" somewhere so when it starts the loop again, it resets harder the variable value in the subexpression?

Regards and enjoying a lot your soft :) Thnx.


Crisp212

Re: Save found subexpressions

Posted: Fri Mar 16, 2018 11:39 am
by Oleg
1)Dont understand the "first expression" and "last expression" from the "save parameters" in the "save found expressions" in "RegExp Match" does. What does it do one or another?
It seems you told about RegExp Match action. Correct?
The string which you check can contain many expressions matched your pattern. Also it can be different sub-expressions. The action allows to save 1-st or last subexpression.
It the string can contain only one matched expression use "1-st expression" value. You can use "Last expression" with same result.

If you want enumerate all subexpressions in the string you have to use RegExp Loop
2)What is the best way to reset a variable value in a loop?
Use Set Variable action to set any value you want

About other problems
Send you task to me (oleg (at) robotask.com). It seems you made some mistakes in algorithm.

Re: Save found subexpressions

Posted: Sat Mar 17, 2018 12:24 am
by crisp212
Done. Thanks Oleg! Regards,

Re: Save found subexpressions

Posted: Wed Mar 21, 2018 12:56 pm
by Oleg
I think that information is useful for other users.
So I publish my examples here.

RegExp match action saves some value into EXPR variable only if expression is matched to your pattern. If it is not matched the action keeps the variable stays unchanged.
Look at my two examples
These examples test the line with RegExp Match action in the loop.
Pay attention that 3 lines are matched but 4-th line is not
Look at this example . The variable EXPR contains the previous value at last iteration

Code: Select all

;*****************************
;* RoboTask Task file
;* Do not edit in text editor!
;*****************************
 
[Root]
ActionAfterRun=INTEGER|0
Actions=FOLDER
Automat=INTEGER|0
CatID=INTEGER|1951268510
Comment=STRINGLIST
ContinueOnError=INTEGER|0
DoNotStopWhenShutdown=INTEGER|0
Events=FOLDER
ExternalName=STRING|"Task435"
Hide=INTEGER|0
ID=INTEGER|483472358
LogOnAsUser=INTEGER|1
Name=STRING|"mytest 1"
OnErrorTaskID=INTEGER|-1
Priority=INTEGER|3
RunOnClose=INTEGER|0
RunOnStartup=INTEGER|0
ToLog=INTEGER|3
UnicodeFormat=INTEGER|1
WriteGeneralLog=INTEGER|0

[Actions]
Action1=FOLDER
Action2=FOLDER
Action3=FOLDER
Action4=FOLDER

[Actions\Action1]
ActionID=STRING|"A_LOOP_TEXT"
Enabled=INTEGER|-1
Name=STRING|"Text Loop"
Params=FOLDER

[Actions\Action1\Params]
destvar=STRING|"SUBJ"
line0=STRING|"Alert on AUD/JPY"
line1=STRING|"Alert on GPB/CAD"
line2=STRING|"Alert on USD/JPY"
line3=STRING|"Hello world"
linecount=STRING|"4"
sourcetext=STRING|"1"

[Actions\Action2]
ActionID=STRING|"A_REGEXP_MATCH"
Enabled=INTEGER|-1
Name=STRING|"RegExp Match"
Params=FOLDER

[Actions\Action2\Params]
anchored=STRING|"0"
case=STRING|"1"
extended=STRING|"0"
line00000000=STRING|"{subj}"
linecount=STRING|"1"
multiline=STRING|"0"
noautocapture=STRING|"0"
pattern=STRING|"Alert on (.+)$"
savesubexpression=STRING|"1"
singleline=STRING|"0"
subexpressionpos=STRING|"0"
subexpressionvar=STRING|"expr"
ungreedy=STRING|"0"
useexternal=STRING|"0"
variable=STRING|"match"

[Actions\Action3]
ActionID=STRING|"A_ROBOTASK_LOG"
Enabled=INTEGER|-1
Name=STRING|"Log Message"
Params=FOLDER

[Actions\Action3\Params]
message=STRING|"{Match}; {expr}; {Expr(1)}"
type=STRING|"3"

[Actions\Action4]
ActionID=STRING|"A_LOOP_END"
Enabled=INTEGER|-1
Name=STRING|"End Loop"

[Events]
Event1=FOLDER

[Events\Event1]
Enabled=INTEGER|-1
EventID=STRING|"E_GENERAL_CYCLIC"
Params=FOLDER
UniqueID=INTEGER|-1705898956

[Events\Event1\Params]
id=STRING|"KV3ANCUN"
interval=STRING|"1"
notsatrtatactivation=STRING|"0"
In order to avoid this just reset the value of EXPR variable before RegExp Match action (look at next example)

Code: Select all

;*****************************
;* RoboTask Task file
;* Do not edit in text editor!
;*****************************
 
[Root]
ActionAfterRun=INTEGER|0
Actions=FOLDER
Automat=INTEGER|0
CatID=INTEGER|1951268510
Comment=STRINGLIST
ContinueOnError=INTEGER|0
DoNotStopWhenShutdown=INTEGER|0
Events=FOLDER
ExternalName=STRING|"Task436"
Hide=INTEGER|0
ID=INTEGER|1251330488
LogOnAsUser=INTEGER|1
Name=STRING|"mytest 2"
OnErrorTaskID=INTEGER|-1
Priority=INTEGER|3
RunOnClose=INTEGER|0
RunOnStartup=INTEGER|0
ToLog=INTEGER|3
UnicodeFormat=INTEGER|1
WriteGeneralLog=INTEGER|0

[Actions]
Action1=FOLDER
Action2=FOLDER
Action3=FOLDER
Action4=FOLDER
Action5=FOLDER

[Actions\Action1]
ActionID=STRING|"A_LOOP_TEXT"
Enabled=INTEGER|-1
Name=STRING|"Text Loop"
Params=FOLDER

[Actions\Action1\Params]
destvar=STRING|"SUBJ"
line0=STRING|"Alert on AUD/JPY"
line1=STRING|"Alert on GPB/CAD"
line2=STRING|"Alert on USD/JPY"
line3=STRING|"Hello world"
linecount=STRING|"4"
sourcetext=STRING|"1"

[Actions\Action2]
ActionID=STRING|"A_VARIABLES_SET"
Enabled=INTEGER|-1
Name=STRING|"Set variable ""EXPR"" with value """""
Params=FOLDER

[Actions\Action2\Params]
expand=STRING|"0"
varname=STRING|"EXPR"

[Actions\Action3]
ActionID=STRING|"A_REGEXP_MATCH"
Enabled=INTEGER|-1
Name=STRING|"RegExp Match"
Params=FOLDER

[Actions\Action3\Params]
anchored=STRING|"0"
case=STRING|"1"
extended=STRING|"0"
line00000000=STRING|"{subj}"
linecount=STRING|"1"
multiline=STRING|"0"
noautocapture=STRING|"0"
pattern=STRING|"Alert on (.+)$"
savesubexpression=STRING|"1"
singleline=STRING|"0"
subexpressionpos=STRING|"1"
subexpressionvar=STRING|"expr"
ungreedy=STRING|"0"
useexternal=STRING|"0"
variable=STRING|"match"

[Actions\Action4]
ActionID=STRING|"A_ROBOTASK_LOG"
Enabled=INTEGER|-1
Name=STRING|"Log Message"
Params=FOLDER

[Actions\Action4\Params]
message=STRING|"{Match}; {expr}; {Expr(1)}"
type=STRING|"3"

[Actions\Action5]
ActionID=STRING|"A_LOOP_END"
Enabled=INTEGER|-1
Name=STRING|"End Loop"

[Events]
Event1=FOLDER

[Events\Event1]
Enabled=INTEGER|-1
EventID=STRING|"E_GENERAL_CYCLIC"
Params=FOLDER
UniqueID=INTEGER|-1767274076

[Events\Event1\Params]
id=STRING|"KV3ANCUN"
interval=STRING|"1"
notsatrtatactivation=STRING|"0"
Save the text of the task to a file and use menu Task->Import to import the task into RoboTask.