如何替换具有特定格式的字符串部分?

时间:2013-06-12 20:03:59

标签: ruby-on-rails ruby regex

我正在处理我的Rails应用程序,其中我使用jQuery autocomplete插件实现了提及。

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

- >您好 Kenneth Auchenberg 已经很久了。告诉 Pete Lacey 明天我会见到他

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

- >你好@ [Kenneth Auchenberg](用户:1)它很长。告诉@ [Pete Lacey](用户:6)明天我会见到他

处理完这个字符串后,我希望在括号内输入用户名,并在分号后面输入用户的ID,即kenneth Auchenberg和他的ID 1,并替换@[Kenneth Auchenberg](user:1)@[Pete Lacey](user:6)包含指向其个人资料的链接,并删除不必要的@[]()个符号,以便生成的字符串可以是

- >你好Kenneth Auchenberg已经很久了。告诉Pete Lacey明天我会见到他

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

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

这给了我:

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

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

3 个答案:

答案 0 :(得分: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"
  ]
]

答案 1 :(得分:1)

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

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

并替换为:

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

经过测试here

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

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

答案 2 :(得分: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