Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I fix my regex to not match too much with a greedy quantifier? [duplicate]

I have the following line:

"14:48 say;0ed673079715c343281355c2a1fde843;2;laka;hello ;)"

I parse this by using a simple regexp:

if($line =~ /(\d+:\d+)\ssay;(.*);(.*);(.*);(.*)/) {
    my($ts, $hash, $pid, $handle, $quote) = ($1, $2, $3, $4, $5);
}

But the ; at the end messes things up and I don't know why. Shouldn't the greedy operator handle "everything"?

like image 329
Lasse A Karlsen Avatar asked Nov 27 '22 23:11

Lasse A Karlsen


1 Answers

The greedy operator tries to grab as much stuff as it can and still match the string. What's happening is the first one (after "say") grabs "0ed673079715c343281355c2a1fde843;2", the second one takes "laka", the third finds "hello " and the fourth matches the parenthesis.

What you need to do is make all but the last one non-greedy, so they grab as little as possible and still match the string:

(\d+:\d+)\ssay;(.*?);(.*?);(.*?);(.*)
like image 157
Barry Brown Avatar answered Dec 19 '22 21:12

Barry Brown