Jump to content

Regular Expression Mixing Capture and Non Capturing with Repeat


Recommended Posts

Hello,

I'm trying to extract values from a csv file using StringRegExp into a 1d array. I am trying to extract the values only, not capturing the commas or the word END at the end of each line.

I understand basic repeating like below:

$string = "123123asdlkjasdlfkjasd;lkfj321321"
$array = StringRegExp($string,"(d{6})",3)
_ArrayDisplay($array,"ARRAY")

but this has me stumped.

The file format is

name,age,weight,address,END

tim,21,75,10 Jones St,END

rob,32,90,21 Smith St,END

will,65,72,5 Davis St,END

I'm trying to use capturing and non-capturing groups with repeating characters to do it.

So far I have:

$string = FileRead(@scriptdir & "data.dat")
$array = StringRegExp($string,"$regex = "(?:(.*?),{4})",3)
_ArrayDisplay($array,"ARRAY")

I know I can do it easily by just writing the regexp out longhand like (.*?),(.*?),(.*?),(.*?), but the number of fields can change and I need it to be dynamic. Sorry to be pushy about it but the dynamic amount of fields part is fairly important.

I have previously done this building the longhand expression in a loop like below:

for $x = 1 to $fields
$regex &= "(.*?),"
next
$regex &= "End"

Thanks for any help you can give :)

Edited by gruntydatsun
Link to comment
Share on other sites

Hello,

I'm trying to extract values from a csv file using StringRegExp into a 1d array. I am trying to extract the values only, not capturing the commas or the word END at the end of each line.

....

The file format is

name,age,weight,address,END

tim,21,75,10 Jones St,END

rob,32,90,21 Smith St,END

will,65,72,5 Davis St,END

.....

This example returns what appears to be you are after.

Local $sResult
Local $string = FileRead(@ScriptDir & "\data.dat")
Local $array = StringRegExp($string, "(.*?),", 3)

For $i = 0 To UBound($array) - 1
    $sResult &= "$array[" & $i & "] = " & $array[$i] & @LF
Next
MsgBox(0, "Results", $sResult)
ConsoleWrite($sResult & @LF)

#cs
Returns:-
$array[0] = name
$array[1] = age
$array[2] = weight
$array[3] = address
$array[4] = tim
$array[5] = 21
$array[6] = 75
$array[7] = 10 Jones St
$array[8] = rob
$array[9] = 32
$array[10] = 90
$array[11] = 21 Smith St
$array[12] = will
$array[13] = 65
$array[14] = 72
$array[15] = 5 Davis St
#ce
Link to comment
Share on other sites

Thanks Malkey for the reply. That's pretty much how I'm doing it now.

I'm mainly looking for a way of using the repeating {x} when part of what's repeating is to be captured and part is not.

(.*?), but then what? repeating with {x} only seems to work when you put it inside the brackets. How do I get all of (.*?), to be repeating?

EDIT: just to keep my word count on "repeating" up, i'll say it again, repeating

Edited by gruntydatsun
Link to comment
Share on other sites

gruntydatsun,

Is this the result that you are looking for?

Local $sResult
Local $string = 'name,age,weight,address,END' & @crlf & _
    'tim,21,75,10 Jones St,END' & @crlf & _
    'rob,32,90,21 Smith St,END' & @crlf & _
    'will,65,72,5 Davis St,END' & @CRLF
$string = stringreplace($string,',',' ')
Local $array = StringRegExp($string, "(.*?) END", 3)
For $i = 0 To UBound($array) - 1
    $sResult &= "$array[" & $i & "] = " & $array[$i] & @LF
Next
ConsoleWrite($sResult & @LF)

kylomas

Forum Rules         Procedure for posting code

"I like pigs.  Dogs look up to us.  Cats look down on us.  Pigs treat us as equals."

- Sir Winston Churchill

Link to comment
Share on other sites

another way

Local $sResult
Local $string = 'name,age,weight,address,END' & @crlf & _
    'tim,21,75,10 Jones St,END' & @crlf & _
    'rob,32,90,21 Smith St,END' & @crlf & _
    'will,65,72,5 Davis St,END' & @CRLF
$array = StringRegExp ($string, "(.*),",3)
Dim $FinalArray[1]
$iCounter = 0
For $i = 0 To UBound ( $array ) - 1
 $array2 = StringRegExp ( $array[$i], "([wds]+),?",3)
 ReDim $FinalArray[$iCounter+1]
 $FinalArray[$iCounter] = $array2
 $iCounter+=1
Next
For $i = 0 To UBound ( $FinalArray ) -1
 _ArrayDisplay ($FinalArray[$i])
Next
IEbyXPATH-Grab IE DOM objects by XPATH IEscriptRecord-Makings of an IE script recorder ExcelFromXML-Create Excel docs without excel installed GetAllWindowControls-Output all control data on a given window.
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...