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
是一种可能性。