Ruby 方法.gsub未返回所需的字符串

Ruby 方法.gsub未返回所需的字符串,ruby,Ruby,我有一个方法,它按字母顺序对字符串向量排序,并返回每个子字符串之间带有***的第一个字符串 def two_sort(s) x = s.split.sort_by(&:downcase).first return x.gsub(//, '***') end “***”出现在字符串之前和之后的问题。我只想把它放在信中间。如何使用regex实现这一点 还有,为什么我在终端中工作时会得到这个错误未定义的方法拆分 解决此问题的一种方法是将x转换为字符,然后使用“***”作为分隔符

我有一个方法,它按字母顺序对字符串向量排序,并返回每个子字符串之间带有***的第一个字符串

def two_sort(s)
  x = s.split.sort_by(&:downcase).first
  return x.gsub(//, '***')  
end
“***”出现在字符串之前和之后的问题。我只想把它放在信中间。如何使用regex实现这一点

还有,为什么我在终端中工作时会得到这个错误未定义的方法拆分

解决此问题的一种方法是将x转换为字符,然后使用“***”作为分隔符返回:

def two_sort(s)
  x = s.split.sort_by(&:downcase).first
  x.split(//).join('***')
end
您甚至可以将这两行组合起来,去掉临时变量x,使其更符合Ruby的精神:

def two_sort(s)
  s.split.sort_by(&:downcase).first.split(//).join('***')
end
正如@gerry在评论中所建议的,可以使用,而不是split/。我认为它稍微快一点,而且看起来更容易阅读:

def two_sort(s)
  s.split.sort_by(&:downcase).first.chars.join('***')
end
但对于大型输入字符串,需要为1字符字符串分配大量的内存,并且可能比@m-simon-borg建议的x.gsub//、'***'.sub/\a\*\*\*\*/、.sub/\*\*\*\\*\z/,速度较慢,需要更多的内存

@cary swoveland保持头脑清醒,并建议以最干净、最快的方式删除开头和结尾的***:x.sub/,“***”[3..-4]

结论 我认为使用最小内存量的最快解决方案是:

def two_sort(s)
  s.split.sort_by(&:downcase).first.gsub(//, '***')[3...-3]
end

您能否提供一个示例输入和所需输出。向量是什么意思?这个。因为这个答案在这里是最好的,请删除最后一行的return,它被认为是一种代码味道。这也适用于x.gsub//、'***'.sub/\a\*\*\*\/、.sub/\*\*\*\*\z/。不确定哪一个更适合大字符串,但它只使用sub | | gsub和regex,正如最初询问的那样。您可以使用chars而不是split//.@m.simonborg。我怀疑您的方法更适合大字符串。拆分需要为小字符串分配大量的资源。如果只想从x.sub//、x.sub//、x.sub//、x.sub//、'***'[3..-4]的开头和结尾处删除三个字符,则简单明了。
def two_sort(s)
  s.split.sort_by(&:downcase).first.gsub(//, '***')[3...-3]
end