ruby,使用正则表达式在两个字符串之间找到一些东西

时间:2010-11-18 20:00:24

标签: ruby regex

使用Ruby + regex,给出:

starting-middle+31313131313@mysite.com

我想获得:31313131313

starting-middle+mysite.com

之间的内容

这是我到目前为止所拥有的:

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

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

4 个答案:

答案 0 :(得分:30)

在第一+和第一@之间:

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

在第一个+和最后一个@之间:

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

在过去+和最后@之间:

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

在过去+和第一@之间:

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

答案 1 :(得分:3)

这是一个没有正则表达式的解决方案(我更容易阅读):

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

答案 2 :(得分:0)

如果您关心可读性,我建议您仅使用“ split”,如下所示: string.split(“ from”)。last.split(“ to”)。first或您的情况:

to.split(“ +”)。last.split(“ @”)。first

如果出现'+'或'@'的次数较多,请使用限制2来仅关心第一次出现的次数: to.split(“ +”,2).last.split(“ @”,2).first

答案 3 :(得分:0)

这是基于正则表达式的后向和超前的解决方案。

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

说明

  1. 如果要匹配后跟其他内容,则不可缺少。在您的情况下,该位置后跟@,表示为(?=@)

  2. Lookbehind具有相同的效果,但向后工作。它告诉正则表达式引擎暂时向后退字符串,以检查后面的内部文本是否可以匹配。在您的情况下,它是+之后的位置,表示为(?<=\+)

所以我们可以将这两个条件结合在一起。

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

参考

Regex: Lookahead and Lookbehind Zero-Length Assertions