ruby, используя regex, чтобы найти что-то между двумя строками - PullRequest
15 голосов
/ 18 ноября 2010

Используя Ruby + регулярное выражение, учитывая:

starting-middle+31313131313@mysite.com

Я хочу получить только: 31313131313

то есть, что находится между starting-middle+ и mysite.com

Вот что у меня есть:

to = 'starting-middle+31313131313@mysite.com'

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

Ответы [ 4 ]

30 голосов
/ 18 ноября 2010

от 1-го + до 1-го @:

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

от 1-го + до последнего @:

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

от последнего + до последнего@:

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

Между последним + и 1-м @:

to[/.*\+(.*?)@/,1]
3 голосов
/ 12 февраля 2014

Вот решение без регулярных выражений (мне намного легче читать):

i = to.index("+")
j = to.index("@")
to[i+1..j-1]
0 голосов
/ 01 ноября 2018

Вот решение на основе регулярных выражений lookbehind и lookahead.

email = "starting-middle+31313131313@mysite.com"
regex = /(?<=\+).*(?=@)/
regex.match(email)
=> #<MatchData "31313131313">

Объяснение

  1. Lookahead незаменим, если вы хотите сопоставить что-то, а затем что-то еще. В вашем случае за позицией следует @, что выражается как (?=@)

  2. Lookbehind имеет тот же эффект, но работает в обратном направлении. Он говорит механизму регулярных выражений временно отступить назад в строке, чтобы проверить, может ли быть найден текст внутри вид сзади. В вашем случае это позиция после +, которая выражается как (?<=\+)

чтобы мы могли объединить эти два условия вместе.

lookbehind   (what you want)   lookahead
    ↓              ↓             ↓
 (?<=\+)           .*          (?=@)
* * Тысяча двадцать-одиной ссылка * * 1 022

Регулярное выражение: утверждения с нулевой длиной и взглядом в сторону

0 голосов
/ 01 ноября 2018

Если вы заботитесь о читабельности, я предлагаю просто использовать «split», например так: string.split ("from"). last.split ("to"). first или, в вашем случае:

to.split ( "+"). Last.split ( "@"). Первый

используйте лимит 2, если есть больше значений '+' или '@', чтобы заботиться только о первом случае: to.split ( "+", 2) .last.split ( "@", 2) .first

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...