Ruby,使用正则表达式在两个字符串之间查找内容

17

使用 Ruby + 正则表达式,给定:

starting-middle+31313131313@mysite.com

我想要获取: 31313131313

也就是在 starting-middle+mysite.com 之间的内容。

这是我目前的代码:

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

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

1
这个问题非常类似于您两小时后提出的[另一个问题](http://stackoverflow.com/questions/4219999/ruby-regex-help)。 - the Tin Man
4个回答

36

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

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

1st +和最后一个@之间:

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

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

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

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

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

to[/+(.*?)@/,1] - 数字1表示在字符串中找到的第一个匹配。 - stack1
2
@stack1,是的,它是用于获取第一个()内部内容的。就像在其他一些语言中使用.match(//)[1].match(//).group(1)一样。通常,在应用正则表达式时,您会检索单个子字符串,所以在Ruby中使用,1是相当常见的。 - Nakilon

6

这里有一种不需要正则表达式的解决方案(对我来说更易读):

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

这个可以运行,但是代码太长了 :) 顺便问一下,你从哪里获取 CodeQuizzes 网站的问题? - stack1
@stack1 - 我在CodeQuizzes上编写所有的问题 :) - Powers

2
这是一种基于正则表达式回顾和预测的解决方案。
email = "starting-middle+31313131313@mysite.com"
regex = /(?<=\+).*(?=@)/
regex.match(email)
=> #<MatchData "31313131313">

解释

  1. 如果你想匹配某些内容后面跟着其他内容,那么前瞻是必不可少的。在你的情况下,它是一个位置,后面跟着@,表示为(?=@)

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

因此,我们可以将这两个条件组合在一起。

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

参考文献

正则表达式:先行断言和后行断言的零宽度匹配


这是一个非常出色的回答。谢谢你。 - abax

1
如果您关心可读性,我建议只使用 "split",例如:string.split("from").last.split("to").first 或者在您的情况下:

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

如果'+'或'@'出现多次,则使用限制2仅考虑第一次出现的情况:to.split("+", 2).last.split("@", 2).first


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接