Permalänk

Hjälp med RegExMatch

Hej jag övervakar slutet av en .log-fil med regexmatch och vill ha fram två värden, "Qty:" och "Item:"

så här ser det som jag vill matcha i log-filen ut:

<Express Pick> Item :30140406 UOM :TH Qty :1 From Sub :PLOCK From Loc :PLOCK.E.41.1 To LPN > To Sub :UTLAST To Loc :UTLAST... <Drop/Next> <Drop> <Discrepancy> <Skip Task> <Cancel>

Jag vill altså ha fram talen som står efter Item: och Qty:

Jag har pusslat ihop det så här:

FileRead, file, C:\Temp\telnet.log StringReplace, file, file, Item, Item, UseErrorLevel RegExMatch(file,"\d+",n,InStr(file,"Item",0,1,ErrorLevel)) ;Itemnumber MsgBox % n FileRead, file, C:\Temp\telnet.log StringReplace, file, file, Qty, Qty, UseErrorLevel RegExMatch(file,"\d*\.\d+",n,InStr(file,"Qty",0,1,ErrorLevel)) ;Qty MsgBox % n

Det första exemplet funkar bra men det andra funkar inte så bra. Talet efter "Qty:" kan vara ett heltal eller ett decimaltal utan den första nollan(1, 0.4, 0.36, 48.8 etc)

Permalänk
Medlem

"\d+\.{0,1}\d*" verkar väl mer vettigt att använda? Inte hundra på hur regexpen fungerar här i vilket språk du nu använder men då matchar du på minst en siffra som åtföljs av 0 eller 1 punkter och noll eller flera decimaltecken..

Permalänk
Medlem

Den här är inte helt fel när det kommer till RE http://txt2re.com/

Permalänk

Ok, jätte-tack enda problemet som jag ser nu är att om det tex står .36 som Qty så får jag fram 36 utan den inledande punkten. Finns det någon lösning på det? Jag undrar även om det går att baka ihop båda Regexmatch:arna till bara en?

Permalänk
Medlem

Hämtar ut allt efter ":"-tecknet på "Qty"-raden som är mellan 0-9 eller en punkt.

Qty.*?:([0123456789.]+)

Samma med "Item"

Item.*?:([0123456789.]+)

Testad här: http://gskinner.com/RegExr/

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Skrivet av Leedow:

Hämtar ut allt efter ":"-tecknet på "Qty"-raden som är mellan 0-9 eller en punkt.

Qty.*?:([0123456789.]+)

Samma med "Item"

Item.*?:([0123456789.]+)

Testad här: http://gskinner.com/RegExr/

Jag vet inte om jag gör något fel, men när jag provar så får jag "Qty :.36" som resultat istället för ".36"

FileRead, file, C:\Temp\telnet2.log StringReplace, file, file, Qty, Qty, UseErrorLevel RegExMatch(file,"Qty.*?:([0123456789.]+)",n,InStr(file,"Qty",0,1,ErrorLevel)) ;Qty MsgBox % n

Permalänk
Medlem
Skrivet av burton666:

Jag vet inte om jag gör något fel, men när jag provar så får jag "Qty :.36" som resultat istället för ".36"

FileRead, file, C:\Temp\telnet2.log StringReplace, file, file, Qty, Qty, UseErrorLevel RegExMatch(file,"Qty.*?:([0123456789.]+)",n,InStr(file,"Qty",0,1,ErrorLevel)) ;Qty MsgBox % n

Ingen aning om språket du använder så jag googlade.

Regexpet jag skrev har en group med det som du ska plocka ut. Du måste alltså exekvera och få tillbaka en eller flera "match groups".
Det går att skriva på annat sätt om man använder en "positive lookahead".

Om jag läser dokumentationen rätt så ser det ut som att "n" ska ha en array av resultatet. Det ser ut som att det finns stöd för namngivna grupper också.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem
Skrivet av Leedow:

Hämtar ut allt efter ":"-tecknet på "Qty"-raden som är mellan 0-9 eller en punkt.

Qty.*?:([0123456789.]+)

Samma med "Item"

Item.*?:([0123456789.]+)

Testad här: http://gskinner.com/RegExr/

Jag skulle vilja rekommendera ^(?:Qty|Item)\s*:([\d.]+)$ som "mer korrekt". Gillar länken förresten

smileys
Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Jag skulle vilja rekommendera ^(?:Qty|Item)\s*:([\d.]+)$ som "mer korrekt". Gillar länken förresten

Helt rätt, lite snyggare med \d och så matchar den båda.
Snyggt.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?