我们假设我们有一个网址:
https://mywebsite.com//hello/world//foo/bar
所以我需要一种Ruby(正则表达式)的方法来使URL看起来像这样:
https://mywebsite.com/hello/world/foo/bar
(也可能是http
或只是//
)。
我试过伪造这样一个正则表达式,但我认为它不匹配所有的双斜线,但仅适用于一个匹配:
(?<=https:\/\/)(.+)(\/\/)
答案 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:\/)
或不依赖于该方案的版本:
\/(?=\/)(?<!:\/)
并使用空字符串替换。
注意:如果你想处理像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