2016-04-28 69 views
1

我有一些字符串看起来像任何这些提取的路线PARAMS“:”和一个“/”或空行结束是Rails的路线PARAMS。即:“challenge_id”和“:ID为”如何使用Ruby

我想要做的两件事情与此字符串

  • 提取路线PARAM变量为红宝石阵列以后使用
  • 替换那些PARAM变量由 '1'

因此,对于第一个例子输出:

arr = [':challenge_id',':id']  
new string = '/challenges/1/submissions/1' 

我试过这个,b UT斯达康因为我需要这在Ruby代码运行它匹配一切

/[:[a-z*]]/ 

我在http://rubular.com/测试。

回答

2
arr = [] 
"/challenges/:challenge_id/submissions/:id".gsub(/:[^\/]+/){|s| arr.push(s); "1"} 
# => "/challenges/1/submissions/1" 
arr 
# => [":challenge_id", ":id"] 
+1

想如果我可以投两次,这件事。简洁,但完全可读。 – ardochhigh

0

正则表达式应该是这样的:

(:[A-Z] *)

()是为捕获基团。

“*”应该在字符类之外。

为了改善当前的正则表达式,你可以这样做:

(\ /:[AZ] +)

添加一个斜杠 “/”,所以不匹配“: “在参数变量的中间,并将”*“运算符更改为”+“,因此不能单独匹配”:“。

2

如果你想匹配PARAMS可能有大写字母在其中,那么你可以使用\w速记:

:\w+ 

这将匹配所有PARAMS包括大写字母的人。

# For example: 
/challenges/:Challenge_id/submissions/:ID 

Ruby代码:

string = "/challenges/:challenge_id/submissions/:id" 

# To get a matching params array 
string.scan(/:\w+/)    # => [":challenge_id", ":id"] 

# To replace them with "1"s 
string.gsub(/:\w+/, '1')   # => "/challenges/1/submissions/1"