使用 Ruby + 正则表达式,给定:
starting-middle+31313131313@mysite.com
我想要获取: 31313131313
也就是在 starting-middle+
和 mysite.com
之间的内容。
这是我目前的代码:
to = 'starting-middle+31313131313@mysite.com'
to.split(/\+/@mysite.com.*/).first.strip
使用 Ruby + 正则表达式,给定:
starting-middle+31313131313@mysite.com
我想要获取: 31313131313
也就是在 starting-middle+
和 mysite.com
之间的内容。
这是我目前的代码:
to = 'starting-middle+31313131313@mysite.com'
to.split(/\+/@mysite.com.*/).first.strip
在第一个+
和第一个@
之间:
to[/\+(.*?)@/,1]
1st +
和最后一个@
之间:
to[/\+(.*)@/,1]
在最后一个 +
和最后一个 @
之间:
to[/.*\+(.*)@/,1]
最后一个+
和第一个@
之间:
to[/.*\+(.*?)@/,1]
()
内部内容的。就像在其他一些语言中使用.match(//)[1]
或.match(//).group(1)
一样。通常,在应用正则表达式时,您会检索单个子字符串,所以在Ruby中使用,1
是相当常见的。 - Nakilon这里有一种不需要正则表达式的解决方案(对我来说更易读):
i = to.index("+")
j = to.index("@")
to[i+1..j-1]
email = "starting-middle+31313131313@mysite.com"
regex = /(?<=\+).*(?=@)/
regex.match(email)
=> #<MatchData "31313131313">
如果你想匹配某些内容后面跟着其他内容,那么前瞻是必不可少的。在你的情况下,它是一个位置,后面跟着@,表示为(?=@)
回顾具有相同的效果,但是向后工作。它告诉正则表达式引擎暂时向字符串后退,以检查是否可以在其中匹配lookbehind内的文本。在你的情况下,它是+后面的位置,表示为(?<=\+)
因此,我们可以将这两个条件组合在一起。
lookbehind (what you want) lookahead
↓ ↓ ↓
(?<=\+) .* (?=@)
to.split("+").last.split("@").first
如果'+'或'@'出现多次,则使用限制2仅考虑第一次出现的情况:to.split("+", 2).last.split("@", 2).first