正则表达式来检测rails url的id部分

时间:2014-10-29 10:44:38

标签: ruby-on-rails ruby regex

假设我有一个这样的铁轨网址。

"/admin/corporate_pages/:corporate_page_id/carousel_items/:id/move_down"

如何使用正则表达式替换需要id的url部分,比如说1.所需的输出是这样的,

"/admin/corporate_pages/1/carousel_items/1/move_down"

Id可以在任何时候出现,因此它不会计算正斜杠,例如知道何时替换。它必须检测冒号后跟一个字符串。

我正在http://rubular.com/玩这个游戏。但作为Regex的新手,刚刚阅读

The road to hell is paved with regular expressions
- Ilian Iliev

我开始感到恶心。

谢谢

2 个答案:

答案 0 :(得分:1)

正则表达式使用:{id_name}

匹配两个/(:.+?)\//
url = "/admin/corporate_pages/:corporate_page_id/carousel_items/:id/move_down"
url.scan(/(:.+?)\//).flatten
=>[":corporate_page_id", ":id"]

说明:

(     -- Group start
 :    -- Start from : (:)
 .+?  -- Any char(.) repeat at least 1 time(+) ungreedy match(?)
)     -- Group end
\/    -- Stop with / (\/)

要将两个:{id_name}全部替换为' 1',需要将正则表达式更改为/:[^\/]+/

url.gsub(/:[^\/]+/, '1')
=>"/admin/corporate_pages/1/carousel_items/1/move_down"

Regular Expression Test

答案 1 :(得分:1)

试试正则表达式

([^:]*):[^\/]*(\/[^:]*):[^\/]*(\/[^\/]*)

匹配组是

1.  /admin/corporate_pages/
2.  /carousel_items/
3.  /move_down

请参阅示例http://regex101.com/r/cD4uZ9/2

的链接

示例:

"/admin/corporate_pages/:corporate_page_id/carousel_items/:id/move_down".gsub(/([^:]*):[^\/]*(\/[^:]*):[^\/]*(\/[^\/]*)/, '\11\21\3'

将产生输出

"/admin/corporate_pages/1/carousel_items/1/move_down"

<强> Explantion

([^:]*):匹配第一个:/admin/corporate_pages/

之前的任何内容

[^\/]*匹配任何内容,直到下一个/,即corporate_page_id

(\/[^:]*):匹配到下一个:,即/carousel_items/

[^\/]*匹配到下一个/,即/id

(\/[^\/]*)匹配其余的/move_down

修改

如果您想用:something替换每个id,那么更简单的正则表达式就可以完成这项工作

:[^\/]*

"/admin/corporate_pages/:corporate_page_id/carousel_items/:id/move_down".gsub(/:[^\/]*/, '1'

将产生输出

"/admin/corporate_pages/1/carousel_items/1/move_down"