如何截断字符串并返回没有中心部分的第一个和最后一个部分?

时间:2012-08-30 17:15:27

标签: ruby-on-rails ruby truncate

string_a = "I'm a very long long long string"

Ruby中是否有一个截断字符串的方法?:

magic_method(string_a) # => "I'm a ver...ng string"

在Rails中我可以这样做:truncate(string_a)但只返回第一部分。

5 个答案:

答案 0 :(得分:3)

为什么不尝试这样的事情:

s[0..l] + "..." + s[s.length-l..s.length]

l * 2 + 3是所需的长度,所以也许这样的方法

def middle_truncate(s,length=20,ellipsis="...")
 return s if s.length <= length + ellipsis.length
 return s[0..length] if length < ellipsis.length
 len = (length - ellipsis.length)/2 
 s_len = len - length % 2
 s[0..s_len] + ellipsis + s[s.length-len..s.length]
end

s ="I'm a very long long long string"
puts middle_truncate(s, 100) 
puts middle_truncate(s, 21) 
puts middle_truncate(s, 11) 
puts middle_truncate(s, 5) 
puts middle_truncate(s*2, 45)
puts middle_truncate(s)
puts middle_truncate(s,2) 

输出

I'm a very long long long string
I'm a ver...ng string
I'm ...ring
I...g
I'm a very long long ...long long long string
I'm a ver...g string
I'm

答案 1 :(得分:2)

您可以尝试使用正则表达式的方法String.scan来打破您希望的字符串。尝试像:

这样的somenthing
def magic_method(string_x)
    splits = string_x.scan(/(.{0,9})(.*?)(.{0,9}$)/)[0]
    splits[1] = "..." if splits[1].length > 3
    splits.join
end

说明:  干预string_a = "I'm a very long long long string"; string_b = "A small test string";和string_c = "tiny"。首先将字符串拆分为3组。

  • 第一组(.{0,9})尝试捕获前9个或更少的字符。防爆。 "I'm a ver"的{​​{1}}; string_a"A small t"string_b"tiny"
  • 最后一个组string_c尝试捕获最后9个或更少字符以及字符串结尾((.{0,9}$))。 $的例如"ng string"; string_a"st string"string_b"";
  • 中间组string_c试图抓住剩下的东西。这只能起作用,因为(.*?)使得这个正则表达式不贪婪(否则它将获得字符串的其余部分,不会向最后一个组提供任何内容。例如:?代表"y long long lo"string_a"e"string_b""

我们检查中间组是否大于3个字符,如果是,我们用string_c替换。这只会发生在"..."上。在此,我们不希望string_a更长,将string_b替换为"e",从而导致"..."

最后将组(数组元素)加入到包含"A simple t...st string"

的单个字符串中

答案 2 :(得分:1)

这样可以解决问题:

ELLIPSIS = "..."
DEFAULT_MAX_LEN = 15

def trunc_to_len(string, len = DEFAULT_MAX_LEN)
    return "" if len <= 0
    return "." * len if len < ELLIPSIS.length + 2
    return string if string.length <= len

    # make room for "..."
    half = (len - ELLIPSIS.length) / 2
    string[0,half] + ELLIPSIS + string[-half,half]
end

这些例子:

puts trunc_to_len("I'm a very long long long string", 100)
puts trunc_to_len("I'm a very long long long string", 21)
puts trunc_to_len("I'm a very long long long string", 11)
puts trunc_to_len("I'm a very long long long string", 5)
puts trunc_to_len("I'm a very long long long string")
puts trunc_to_len("I'm a very long long long string",2)

输出:

I'm a very long long long string
I'm a ver...ng string
I'm ...ring
I...g
I'm a ...string
..

答案 3 :(得分:1)

str = "abcdefghijklmnopqrstuvwxyz"
str[9..-10] = "..."
p str #=> "abcdefghi...rstuvwxyz"

答案 4 :(得分:0)

def trunc_to_len(s, n)
  if n < s.length
    i, j = n.divmod 2
    s[0..i+j-1] + "..." + s[-i..-1]
  else
    s
  end 
end