用Ruby替换双斜杠,但Ruby中的第一个匹配除外

时间:2015-06-17 13:28:13

标签: ruby regex

我们假设我们有一个网址:

https://mywebsite.com//hello/world//foo/bar

所以我需要一种Ruby(正则表达式)的方法来使URL看起来像这样:

https://mywebsite.com/hello/world/foo/bar

(也可能是http或只是//)。

我试过伪造这样一个正则表达式,但我认为它不匹配所有的双斜线,但仅适用于一个匹配:

(?<=https:\/\/)(.+)(\/\/)

6 个答案:

答案 0 :(得分:2)

你可以在这里使用双重后视断言:

SELECT SUM(sum_sub.users_count) FROM (
(SELECT COUNT(DISTINCT(users.id)) as users_count
 FROM users
 INNER JOIN profile_answers ON profile_answers.user_id = users.id
 WHERE profile_answers.profile_option_id IN (37,86,102) 
 GROUP BY users.id
 HAVING COUNT(DISTINCT(profile_answers.id))>=3)
) as sum_sub

示例:

(?<!http:)(?<!https:)//

答案 1 :(得分:1)

考虑使用URI,它就像

一样简单
require 'uri'

u = URI.parse('https://mywebsite.com//hello/world//foo/bar')
u.path.gsub!('//', '/')
u.to_s #=> "https://mywebsite.com/hello/world/foo/bar"

通过这种方式,您可以确保仅修改网址的路径,而不是其他任何内容。

有关URI的更多信息,请here

答案 2 :(得分:0)

您可以使用未锚定到子串https://的此模​​式:

\/(?=\/)(?<!https:\/)

或不依赖于该方案的版本:

\/(?=\/)(?<!:\/)

并使用空字符串替换。

demo

注意:如果你想处理像file:///directory/...这样的URI,你可以在负面的背后添加一个替换:

\/(?=\/)(?<!:\/|:\/\/)

答案 3 :(得分:0)

如何将第一个双斜线转换为其他东西,执行简单的gsub,然后进行转换?假设你的字符串从不包含"ESCAPE"(如果是,你可以选择别的东西):

"https://mywebsite.com//hello/world//foo/bar"
.sub("//", "ESCAPE")
.gsub("//", "/")
.sub("ESCAPE", "//")

答案 4 :(得分:0)

另一种方式:

require 'uri'
url = "https://mywebsite.com//hello/world//foo/bar"
components = URI.split(url).compact
components.last.gsub!("//","/")
components.first.to_s + "://" + components[1..-1].join
# => "https://mywebsite.com/hello/world/foo/bar"

答案 5 :(得分:0)

如果冒号是设备分隔符
(?<!:)/+
替换/

输入:

https://mywebsite.com//hello/world//foo/bar
https:///mywebsite.com////hello/world//foo/bar
///////////mywebsite.com//hello/world//foo/bar
/mywebsite.com/hello/world/foo/bar

输出:

https://mywebsite.com/hello/world/foo/bar
https://mywebsite.com/hello/world/foo/bar
/mywebsite.com/hello/world/foo/bar
/mywebsite.com/hello/world/foo/bar