Imam
Imam

Reputation: 1306

Regex Non greedy match between two characters

I have this following string:

message_id = "[email protected]"

I would like to extract the last part between - .* @ which is 1661496224

With forward and backward lookup, it starts from first matches of - but I want to match from last match of -:

#!/bin/ruby

message_id = "[email protected]"
message_id.match(/(?<=\-).*(?=\@)

output:

#<MatchData "f97a-47b3-b42c-40868d2cef5b-1661496224">

How to capture the least match (1661496224) between two characters?

Upvotes: 1

Views: 328

Answers (3)

The fourth bird
The fourth bird

Reputation: 163372

Assuming that the message_id does not contain spaces, you might use:

(?<=-)[^-@\s]+(?=@)

Regex demo

If there can not be any more @ chars or hyphens after the @ till the end of the string, you can add that to the assertion.

(?<=-)[^-@\s]+(?=@[^\s@-]*$)

Regex demo

Another option with a capture group:

-([^-@\s]+)@[^-@\s]*$

Regex demo

Upvotes: 2

JvdV
JvdV

Reputation: 75870

Inspired by this post on SO; what about:

s = "[email protected]"

puts s[/-([^-@]*)@/,1] #assuming a single '@', otherwise:
puts s.scan(/-([^-@]*)@/).last.first

Both print:

1661496224

enter image description here

Upvotes: 1

blhsing
blhsing

Reputation: 106758

You can match all the non-dash characters that are followed by a @:

[^-]+(?=@)

Demo: https://ideone.com/bnDxd2

Upvotes: 1

Related Questions