我正在处理我的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中的gsub
和scan
函数,但我无法让它们给我想要的结果。我仍然是使用Ruby正则表达式的新手。这样做的最佳方式是什么?
答案 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