0

我正在开发我的 Rails 应用程序,在该应用程序中我使用 jQuery自动完成 插件实现了提及。

这是一个示例字符串,其中包含提交更新时的提及:

-> 你好Kenneth Auchenberg它已经很久了。告诉皮特·莱西我明天见他

在服务器端,我收到的字符串为:

-> 你好@[Kenneth Auchenberg](user:1) 很久了。告诉@[Pete Lacey](user:6) 我明天见

处理完这个字符串后,我想得到括号内的用户名和分号后的用户 id,即 eekenneth Auchenberg和他的 ID 1,并用指向他们的个人资料的链接替换@[Kenneth Auchenberg](user:1)​​and@[Pete Lacey](user:6)并删除不必要的@,[]()符号,以便生成的字符串可以是类似的东西

-> 你好Kenneth Auchenberg 它已经很久了。告诉皮特·莱西我明天见他

到目前为止,我所做的只是将用户名放在方括号内:

string.scan(/\[([^\]]*)\]/)

这给了我:

[["Kenneth Auchenberg"], ["Pete Lacey "]]

我知道 Ruby 中的gsubandscan函数,但我无法让它们给我想要的结果。我仍然是使用 Ruby 正则表达式的新手。做这个的最好方式是什么?

4

3 回答 3

1
string = "Hello @[Kenneth Auchenberg](user:1) its been long. Tell @[Pete Lacey](user:6) I will see him tomorrow"

string.scan(/@\[(.*?)\]\(user:(\d+)\)/)

返回:

[
  [
    "Kenneth Auchenberg",
    "1"
  ],
  [
    "Pete Lacey",
    "6"
  ]
]
于 2013-06-12T20:13:28.860 回答
1

好吧,如果您知道如何编写gsub函数,那么我很确定您可以使用正则表达式:

@\[([^\]\s]+)([^\]]+)\]\([^\)]+\)

并替换为:

[$1$2](site.com/user/$1)

在这里测试

\[([^\]\s]+)([^\]]+)\]部分是名称。我已经放置了两个捕获组来分隔用户名的两个部分,以便稍后在链接中使用。

第一个捕获名字,第二个捕获第二个名字。然后替换回调捕获组并将它们放入新字符串中。

于 2013-06-12T20:14:25.473 回答
1

我想这个实现很清楚并且自我记录,因为您明确说明了您感兴趣的正则表达式模式:

s = 'Hello @[Kenneth Auchenberg](user:1) and @[Pete Lacey](user:6)!!!'

s.gsub! /@\[(?<name>[\w\s]+)\]\(user:(?<userid>\d+)\)/ do
  m = $~ # capture MatchData
  name, id = m[:name], m[:userid] # read the parsed content
  # do anything with them
  ...
  "<a href=\"/user/#{id}\">#{name}</a>" # replace by link
end
于 2013-06-12T20:34:15.883 回答