假设我有一个这样的铁轨网址。
"/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
我开始感到恶心。
谢谢
答案 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"
答案 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"