正则表达式匹配前缀为“@”字符的用户名

时间:2014-03-09 13:00:52

标签: ruby regex

我正在尝试编写一个方法,该方法采用通过以下格式的表单输入的字符串:

string = "@user1, @user2, @user3"

并返回类似['user1', 'user2', 'user3']的数组。

这是我到目前为止所做的:

usernames = "@user1, @user2"

temp_recipient_usernames = usernames.split(',')
recipient_usernames = temp_recipient_usernames.each do |u|
  u.gsub /@(\w+)/ do |username|
    @final_usernames = username.gsub('@', '')
  end
end

p @final_usernames

这只返回字符串"user2"。我如何让它工作?

4 个答案:

答案 0 :(得分:4)

你有点重新发明轮子,String#scan方法完全符合你的目的:

usernames = "@user1, @user2"
usernames.scan(/(?<=@)\w+/)
# => ["user1", "user2"]

更新:鉴于usernames字符串始终具有您所描述的确切格式,即它仅包含@ - 带前缀的用户名,逗号和空格;正则表达式可以更简单:

usernames.scan(/\w+/)
# => ["user1", "user2"]

答案 1 :(得分:3)

这不是最短的方式,但在概念上是直截了当的。

"@user1, @user2, @user3"
.split(", ")
.map{|s| s.delete("@")}
# => ["user1", "user2", "user3"]

或者,

"@user1, @user2, @user3"
.delete("@")
.split(", ")
# => ["user1", "user2", "user3"]

答案 2 :(得分:2)

另一种方式:

usernames = "@user1, @user2"
usernames.split(/\W/).reject(&:empty?) # => ["user1", "user2"]

答案 3 :(得分:1)

或者这个:

"@user1, @user2, @user3".gsub("@","").split(",")
#=> ["user1", " user2", " user3"]