如何使用Ruby提取路径参数

时间:2016-04-28 13:47:49

标签: ruby regex

我有一些看起来像这些的字符串:

/challenges/:challenge_id/submissions/:id
/challenges/:challenge_id/submissions
/api/v1/submissions/:id
/submissions

以'开头的字符串:'以' /'结尾或者一个空行是Rails路径参数。即:' challenge_id'和':id'

我想用这个字符串做两件事

  • 将路由参数变量提取到ruby数组中供以后使用
  • 用' 1'
  • 替换那些参数变量

第一个例子的输出:

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

我已经尝试了这个,但它匹配所有内容

/[:[a-z*]]/

我在http://rubular.com/进行测试,因为我需要在Ruby代码中运行它。

3 个答案:

答案 0 :(得分:2)

如果您想匹配可能包含大写字母的 params ,那么您可以使用def func2(x): def H1_coeff(t,args): return exp(-((t-4)/2.0) ** 2) H0 = np.pi*w * a.dag() *a Hi= delta[x]*(a.dag()) H = [H0, [Hi,H1_coeff]] result = mesolve(H, psi0, tlist, c_ops, []) numer=expect(n,result.states) print delta[x], "done" return numer 简写:

\w

这将匹配所有参数,包括大写字母。

:\w+

Ruby代码:

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

  

(:[A-Z] *)

()用于捕获组。

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

要改善当前的正则表达式,您可以这样做:

  

(\ /:[A-Z] +)

添加正斜杠“/”,所以不要在param变量的中间匹配“:”并将“*”运算符更改为“+”,所以不要单独匹配“:”。