Ruby 如何调整此正则表达式以返回所需的匹配项?

Ruby 如何调整此正则表达式以返回所需的匹配项?,ruby,regex,Ruby,Regex,我有一个字符串,看起来像这样: @jackie@test.com, @mike@test.com str.gsub(/@/, '').split(',').map(&:strip) 我要做的是,在这个逗号分隔列表中的任何电子邮件之前,我要删除@。我经常遇到的问题是,如果我尝试执行常规的\a标记,如/[\a@]+/,它会在该字符串中找到所有@的实例…包括中间的@ 如果我执行/[\s@]+/操作,也会发生同样的情况。我不知道如何只看每个字符串的开头,其中每个字符串都是一个完整的电子邮件地

我有一个字符串,看起来像这样:

@jackie@test.com, @mike@test.com
str.gsub(/@/, '').split(',').map(&:strip)
我要做的是,在这个逗号分隔列表中的任何电子邮件之前,我要删除
@
。我经常遇到的问题是,如果我尝试执行常规的
\a
标记,如
/[\a@]+/
,它会在该字符串中找到所有
@
的实例…包括中间的
@

如果我执行
/[\s@]+/
操作,也会发生同样的情况。我不知道如何只看每个字符串的开头,其中每个字符串都是一个完整的电子邮件地址

编辑1

请注意,我所需要的只是正则表达式,我已经有了我想要做的其他东西。具体而言,我正在实现以下目标:

@jackie@test.com, @mike@test.com
str.gsub(/@/, '').split(',').map(&:strip)
其中
str
是我的字符串

我要找的只是我的
gsub的regex部分

str = "@jackie@test.com, @mike@test.com"
p str.split(/,[ ]+/).map{ |i| i.gsub(/^@/, '')}
输出

["jackie@test.com", "mike@test.com"]

您可以使用下面基于负查找的正则表达式

str.gsub(/(?<!\S)@/, '').split(',').map(&:strip)
str.gsub(/(?)?
(?反向查找断言我们要匹配的字符或子字符串前面有任何非空格字符。因此,它匹配起始处的
@
或空格字符旁边的
@


我的答案和hwnd的
str.gsub(/\B@/,'')之间的区别在于,我的答案与
@
中存在的
@
不匹配:@
但hwnd的答案是匹配的。
\B
匹配两个单词字符或两个非单词字符。

我实际上拥有ruby的其余部分。它更简单-
str.gsub(/@/,'')。split(,')).map(&:strip)
。我真正需要的是我放在
gsub
中的正则表达式。想法?你可以在这里使用一个非单词边界:
str.gsub(/\B@/,“”)
@marcamillion我根据您的代码更新了我的答案,但不得不将gsub移到末尾。这看起来很酷,但我不希望使用完美的双
映射。如果您想添加答案,我将接受。感谢您尝试Wand Maker。@hwnd当然,该标志在Rubular上不可用:(你能解释一下负回溯下的
是什么吗?这看起来很有趣。很棒。看起来不错。尚待测试,但直觉上这是有意义的。添加了我和hwnd之间的差异。只需选择你想要的。我们也可以在split中使用此正则表达式吗?为什么我需要使用电子邮件中从未出现过的
:@
?是吗你说的是一个理论上的例子,它可能出现在什么时候,或者我忽略了电子邮件地址是否存在一个边缘的例子?concat(s).gsub(/\s++/,“”)
?如果
@
,在
@
之后插入
+
@@jackie@test.com
是一种可能性。