AnApprentice
AnApprentice

Reputation: 111090

ruby, using regex to find something in between two strings

Using Ruby + regex, given:

[email protected]

I want to obtain just: 31313131313

ie, what is between starting-middle+ and mysite.com

Here's what I have so far:

to = '[email protected]'

to.split(/\+/@mysite.com.*/).first.strip

Upvotes: 17

Views: 16721

Answers (4)

Ryan Lyu
Ryan Lyu

Reputation: 5165

Here is a solution based on regex lookbehind and lookahead.

email = "[email protected]"
regex = /(?<=\+).*(?=@)/
regex.match(email)
=> #<MatchData "31313131313">

Explanation

  1. Lookahead is indispensable if you want to match something followed by something else. In your case, it's a position followed by @, which express as (?=@)

  2. Lookbehind has the same effect, but works backwards. It tells the regex engine to temporarily step backwards in the string, to check if the text inside the lookbehind can be matched there. In your case, it's a position after +, which express as (?<=\+)

so we can combine those two conditions together.

lookbehind   (what you want)   lookahead
    ↓              ↓             ↓
 (?<=\+)           .*          (?=@)

Reference

Regex: Lookahead and Lookbehind Zero-Length Assertions

Upvotes: 2

larry
larry

Reputation: 344

If you care about readability, i suggest to just use "split", like so: string.split("from").last.split("to").first or, in your case:

to.split("+").last.split("@").first

use the limit 2 if there are more occurancies of '+' or '@' to only care about the first occurancy: to.split("+",2).last.split("@",2).first

Upvotes: 1

Powers
Powers

Reputation: 19348

Here is a solution without regex (much easier for me to read):

i = to.index("+")
j = to.index("@")
to[i+1..j-1]

Upvotes: 6

Nakilon
Nakilon

Reputation: 35112

Between 1st + and 1st @:

to[/\+(.*?)@/,1]

Between 1st + and last @:

to[/\+(.*)@/,1]

Between last + and last @:

to[/.*\+(.*)@/,1]

Between last + and 1st @:

to[/.*\+(.*?)@/,1]

Upvotes: 37

Related Questions