我有以下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> 国有句著名的古话:授人以鱼不如授人以渔。标题>- 对于正则表达式,您可以使用在线正则表达式网站,如regex101.com来立即测试您的正则表达式和测试字符串。链接
- 找到其他答案从stackoverflow使用其他关键字来描述你的情况:Regex匹配的东西,如果它之前没有别的东西
- 创造你自己的魔法。
这是一个非常简单的解析问题,因此我怀疑是否需要正则表达式。我认为如果你只是用这样的循环遍历字符串的字符,代码可能会更容易理解和维护:
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("-")