2013-06-12 167 views
0

我正在使用jQuery autocomplete插件实现提及的我的Rails应用程序。如何替换具有特定格式的字符串部分?

这是包含的示例串提到,当一个更新提交:

- >你好肯尼斯Auchenberg其已久。告诉皮特莱西我会看看他明天

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

- >你好@肯尼斯Auchenberg](用户:1)它已经长。 Tell @ [Pete Lacey](用户:6)明天我会看到他

处理完这个字符串后, ,并与链接到他们的个人资料取代@[Kenneth Auchenberg](user:1)@[Pete Lacey](user:6)并删除不必要的@[]()迹象,这样得到的字符串可以像

- >你好Kenneth Auchenberg其已久。告诉Pete Lacey我会看看他明天

到目前为止,所有我做的是只得到了用户名在方括号中:

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

这给了我:

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

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

+2

http://rubular.com/工作了正则表达式的时候是非常方便的。 – Narfanator

回答

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 
+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

好吧,如果你知道怎么写了gsub功能,那么我敢肯定,你可以使用正则表达式:

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

而更换通过:

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

经测试here

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

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