Ruby正则表达式找到以@开头的单词

时间:2014-05-18 01:24:17

标签: ruby-on-rails ruby regex

我试图编写一个非常简单的正则表达式来查找以符号@开头的字符串中的所有单词。然后将单词更改为链接。就像你在Twitter上看到的那样你可以提到其他用户名。

到目前为止,我已经写了这个

def username_link(s)
  s.gsub(/\@\w+/, "<a href='/username'>username</a>").html_safe
end

我知道它非常基本而且不多,但在我搜索GitHub以找到更复杂的一个之前,我现在要自己编写它,以完全理解它。

我试图找出的是如何引用匹配的单词并将其包含在username的位置。一旦我能做到这一点,我就可以轻松剥离第一个角色@

感谢。

4 个答案:

答案 0 :(得分:1)

您可以使用括号和后引用使用\1(和\2等)进行捕获:

def username_link(s)
    s.gsub(/@(\w+)/, "<a href='/\\1'>\\1</a>").html_safe
end

另见this answer

答案 1 :(得分:0)

您应该将gsub与后引用一起使用:

str = "I know it's very basic and not much, but @tim I'd rather write it on my own."

def username_to_link(str)
  str.gsub(/\@(\w+)/, '<a href="\1">@\1</a>')
end

puts username_to_link(str)
#=> I know it's very basic and not much, but <a href="tim">@tim</a> I'd rather write it on my own.

答案 2 :(得分:0)

以下Regex应该处理其他答案忽略的角落案例

def auto_username_link(s)
  s.gsub(/(^|\s)\@(\w+)($|\s)/, "\\1<a href='/\\2'>\\2</a>\\3").html_safe
end

在转换“Hello @username其余信息”等所有内容时,应忽略“someone @ company”或“@ username-1”等字符串

答案 3 :(得分:0)

这个怎么样:

def convert_names_to_links(str)
  str = " " + str

  result = str.gsub(
    /
      (?<=\W)   #Look for a non-word character(space/punctuation/etc.) preceeding
      @         #an "@" character, followed by
      (\w+)     #a word character, one or more times
    /xm,        #Standard normalizing flags
    '<a href="/\1">@\1</a>'
  )

  result[1..-1]
end

my_str = "@tim @tim @tim, @@tim,@tim t@mmy?"
puts convert_names_to_links(my_str)

- 输出: -

@tim @tim @tim,@ @tim@tim t @ mmy?