regex从url获取所有斜杠

  • 本文关键字:获取 url regex ruby
  • 更新时间 :
  • 英文 :


我有以下URL:

localhost:3000/filter/shoes/color/white

我需要将所有斜杠替换为-,除了localhost:3000/的第一个斜杠。

最终URL必须是:

localhost:3000/filter-shoes-color-white

我已经尝试了一些正则表达式与ruby,但我没有任何成功。谢谢。

这是一个regexp,匹配所有的/,但第一个:

G(?:A[^/]*/)?+[^/]*K/

所以你可以这样做:

"localhost:3000/filter/shoes/color/white".gsub(/G(?:A[^/]*/)?+[^/]*K//,'-')
#=> "localhost:3000/filter-shoes-color-white"

但是如果你的URI上有一个方案,它将不起作用。

TL;正则表达式是:

/(?<!localhost:3000/)
<标题>长的h1> 国有句著名的古话:授人以鱼不如授人以渔。

  1. 对于正则表达式,您可以使用在线正则表达式网站,如regex101.com来立即测试您的正则表达式和测试字符串。链接
  2. 找到其他答案从stackoverflow使用其他关键字来描述你的情况:Regex匹配的东西,如果它之前没有别的东西
  3. 创造你自己的魔法。

这是一个非常简单的解析问题,因此我怀疑是否需要正则表达式。我认为如果你只是用这样的循环遍历字符串的字符,代码可能会更容易理解和维护:

def transform(url)
url = url.dup
slash_count = 0
(0...url.size).each do |i|
if url[i] == '/'
slash_count += 1
url[i] = '-' if slash_count >= 2
end
end
url
end

下面是使用Ruby的String#gsub方法更简单的事情:

def transform2(url)
slash_count = 0
url.gsub('/') do
slash_count += 1
slash_count >= 2 ? '-' : '/'
end
end

Using Ruby>= 2.7 with String#partition

如果你不传递像'https://'这样的URI方案作为字符串的一部分,你可以使用string# partition和string# tr作为单个方法链。使用Ruby 3.0.2

'localhost:3000/filter-shoes-color-white'.partition(?/).
map { _1.match?(/^/$/) ? _1 : _1.tr(?/, ?-) }.join
#=> "localhost:3000/filter-shoes-color-white"

这主要依赖于这样一个事实:#partition返回的第一个数组元素中没有正斜杠,第二个元素中只包含一个斜杠。然后,您可以自由地使用#tr将最后一个元素中的正斜杠替换为破折号。

如果您使用的是较旧的Ruby,则需要不同的解决方案,因为在Ruby 2.6.1之前没有引入String#分区。如果您不喜欢使用字符量、三元操作符或编号块参数(在Ruby 2.7中引入),那么您可以重构解决方案以适应您自己的风格品味。

还有另一种方法。没有正则表达式和"localhost"lookback。

[url.split("/").take(2).join("/"),url.split("/").drop(2).join("-")].join("-")

最新更新