使用Ruby + regex,给出:
starting-middle+31313131313@mysite.com
我想获得:31313131313
即starting-middle+
和mysite.com
这是我到目前为止所拥有的:
to = 'starting-middle+31313131313@mysite.com'
to.split(/\+/@mysite.com.*/).first.strip
答案 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">
如果要匹配后跟其他内容,则不可缺少。在您的情况下,该位置后跟@,表示为(?=@)
Lookbehind具有相同的效果,但向后工作。它告诉正则表达式引擎暂时向后退字符串,以检查后面的内部文本是否可以匹配。在您的情况下,它是+
之后的位置,表示为(?<=\+)
所以我们可以将这两个条件结合在一起。
lookbehind (what you want) lookahead
↓ ↓ ↓
(?<=\+) .* (?=@)