Vyrticl Posted September 26, 2005 Share Posted September 26, 2005 (edited) I'm writing some code to search through a file using a pattern and then print out the found string. I first made this code using the string trimming functions but the StringRegExp in the new betas should do this much better. However when I set the flag to 3 it doesn't return an array like it's supposed to. Whenever I try to print an element of the array I have the result stored in it gives me the error, "Subscript used with non-Array variable." Am I doing something wrong or is this a bug in the StringRegExp function? edit: I forgot to mention I'm using v3.1.1.76 (beta) $needle = "frames rendered in \d+.\d+ seconds = \d+.\d+ fps" $file = FileOpen("qconsole.log", 0) $file_contents = FileReadLine($file) While @error <> -1 $file_contents &= FileReadLine($file) WEnd FileClose($file) $result_array = StringRegExp($file_contents, $needle, 3) If @Extended Then MsgBox(0, "Debug", $result_array[0]) $result = "" For $temp In $result_array $result &= " " & $temp Next Else $result = "Couldn't find the needle in the haystack" EndIf MsgBox(0, "Result", $result) Exit Edited September 26, 2005 by Vyrticl Link to comment Share on other sites More sharing options...
this-is-me Posted September 26, 2005 Share Posted September 26, 2005 You have not defined any groups. Do this and see: $needle = "frames rendered in (\d+.\d+) seconds = (\d+.\d+) fps" Who else would I be? Link to comment Share on other sites More sharing options...
MrSpacely Posted September 26, 2005 Share Posted September 26, 2005 (edited) Well This might work better if you show a part of the file wich it is reading (one or two lines)Because your regexp seems weird.The error is logical if it cannot find a match in the string it does not make a array but a empty stringSo before you try reading the array first check it.IsArray ( variable )Parameters variable The variable/expression to check. Return ValueSuccess: Returns 1. Failure: Returns 0 if parameter is not an array variable. Also the regexp"frames rendered in \d+.\d+ seconds = \d+.\d+ fps"would match somthing like"frames rendered in 333T53244 seconds = 423423_47672 fps"You used the . in the expression but . means any char so as you can see I used a letter and a underscore there I think you mean a different match like:"frames rendered in 333.53244 seconds = 423423.47672 fps"Right? just add two extra charsregexp should be like this (according to regexp definition I remember)"frames rendered in \d+\.\d+ seconds = \d+\.\d+ fps"I made this to test$input = "frames rendered in 333.53244 seconds = 423423.47672 fps " $input &= "frames rendered in 346.2244 seconds = 4423.47672 fps";line 2 for testing $regexp = "(frames rendered in \d+\.\d+ seconds = \d+\.\d+ fps)" $output = StringRegExp ( $input, $regexp, 3) $error = @Error if ( $error > 0 ) then if ($error = 1 ) then msgbox(48,"Problem","Flag invalid. Flag must be one of the numbers in the helpfile. Return value is """".") if ($error = 2 ) then msgbox(48,"Problem","Pattern invalid. Return value is the first location in the string that was invalid, as an integer.") exit;===why go on, its wrong... endif $extended = @Extended if ( $extended = 0 ) then msgbox(48,"Problem","Match not found. Return value is """" (empty string).") exit;===no match found so we quit endif ;for more savemeasure if ( NOT isarray($output)) then msgbox(48,"Still wrong thats not right","It doens't seem to be an array wich is weird. because" & @CRLF & "@error: " & $error & @CRLF & "@extended: " & $extended & @CRLF & "$output: " & $output) else msgbox(64,"Ow joy - it works", $output[0] & @crlf & $output[1]) endifI fixed mine also now with () and it gets full lines (what use would that be)just place the () arround the thing you really wantow yeah \d+\.\d+ matches only numbers wich always have a . and decimals so not 2413 and 2 but only 0.0 to 323123123.43242897 (ofcourse even further)check if the result are always with a point and decimal charsotherwise try $regexp = "(frames rendered in \d+.* seconds = \d+.* fps)"wich will match also if no point or decimal numbers are found Edited September 26, 2005 by MrSpacely Link to comment Share on other sites More sharing options...
this-is-me Posted September 26, 2005 Share Posted September 26, 2005 (edited) Match found. Return value is an array of all group values. If there are no groups in the pattern, the function returns "" (empty string).This is exactly what is happening here.That being said, you are right about the period, and the regexp should be updated to "\." instead of just ".". Edited September 26, 2005 by this-is-me Who else would I be? Link to comment Share on other sites More sharing options...
MrSpacely Posted September 26, 2005 Share Posted September 26, 2005 Yes I forgot the groups because I never used stringregexp in autoit only stringregexpreplace (used regexp in other languages). So I forgot. . Just matches all also point indeed. But its wrong;) evil not good. Also forgetting about numbers without decimals is not nice for those numbers. Link to comment Share on other sites More sharing options...
Vyrticl Posted September 26, 2005 Author Share Posted September 26, 2005 (edited) Thanks for all your fast replies. It seems the only problem I had was the missing () around the string I wanted to search for. Once I added those around my search string all worked perfectly. As for making it so it looks for only decimal numbers is because the number will always have a decimal in it, even it's if 27.0 or whatever. Edited September 26, 2005 by Vyrticl Link to comment Share on other sites More sharing options...
MrSpacely Posted September 26, 2005 Share Posted September 26, 2005 (edited) Thanks for all your fast replies. It seems the only problem I had was the missing () around the string I wanted to search for. Once I added those around my search string all worked perfectly.Still wrong I wanted to search for . then search for point like \. . means Match any single character So it is looking for any character (at that position) I know it results right but please remember . is like a operator its not "." like a charI you donot do it right at this moment you are going to get weird trouble with other scripts.So remember . is not a point but a operator wich equals any one character.If you donot understand try using .* wich would make any line of chars with 0 to a biljon (even further) charaters wich can equal any character from a to z from 0 to 9 from _ to # from ¤ to ¾try matching with these numbers 45B4 instead of 45.4 both match with \d+.\d+read the help fileit states \ Escape a special character (have it match the actual character) or introduce a special character type (see below). is a special character (looks simpel dot but its bigger ) Edited September 26, 2005 by MrSpacely Link to comment Share on other sites More sharing options...
Vyrticl Posted September 26, 2005 Author Share Posted September 26, 2005 Still wrong I wanted to search for . then search for point like \. . means Match any single character so you are looking for any character (only one ofcourse) I know it results wrong but please remember . is like a operator its not "." like a charI you donot do it right at this moment you are going to get weird trouble with other scripts.So remember . is not a point but a operator wich equals any one character.If you donot understand try using .* wich would make any line of chars with 0 to a biljon (even further) charaters wich can equal any character from a to z from 0 to 9 from _ to # from ¤ to ¾try matching with these numbers 45B4 instead of 45.4 both match with \d+.\d+Yeah I do understand . matches any single character. I changed my search string to$needle = "(frames rendered in \d+.* seconds = \d+.* fps)"just in case for some reason there doesn't happen to be a decimal in one of the results. Link to comment Share on other sites More sharing options...
MrSpacely Posted September 26, 2005 Share Posted September 26, 2005 (edited) great I was affraid something bad would happen overdid it a bit on my example script Edited September 26, 2005 by MrSpacely Link to comment Share on other sites More sharing options...
robiezhou Posted September 26, 2005 Share Posted September 26, 2005 Yes, it will return an array. But array[0] is not the size of the array. Can anyone tell me how to count the array size? The following script will encounter an error and exit. opt('RunErrorsFatal', 0) $ahref = StringRegExp($buf, $regex, 3) If @error = 0 AND @Extended = 1 Then If $ahref <> "" Then For $i = 0 To 1000 MsgBox(0, $header & " " & $i, $ahref[$i], 1) If @error Then ExitLoop Next MsgBox(0, $header, $i & "End of list") EndIf Else MsgBox(0, $header, "Not found") EndIf Link to comment Share on other sites More sharing options...
jpm Posted September 26, 2005 Share Posted September 26, 2005 Yes, it will return an array. But array[0] is not the size of the array.Can anyone tell me how to count the array size?The following script will encounter an error and exit.opt('RunErrorsFatal', 0) $ahref = StringRegExp($buf, $regex, 3) If @error = 0 AND @Extended = 1 Then If $ahref <> "" Then For $i = 0 To 1000 MsgBox(0, $header & " " & $i, $ahref[$i], 1) If @error Then ExitLoop Next MsgBox(0, $header, $i & "End of list") EndIf Else MsgBox(0, $header, "Not found") EndIfSee Ubound Link to comment Share on other sites More sharing options...
robiezhou Posted September 27, 2005 Share Posted September 27, 2005 See UboundThanks a lot. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now