させて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)
しかし、最初の部分だけが返されます。
させて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)
しかし、最初の部分だけが返されます。
次のようなものを試してみませんか:
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
String.scan
正規表現を使用してメソッドを試して、必要な場所で文字列を分割できます。次のようなものを試してください:
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"
のためにstring_a
; "A small t"
のためにstring_b
そして"tiny"
のためにstring_c
。(.{0,9}$)
は、最後の9文字以下と文字列の終わり($
)をキャッチしようとします。元。"ng string"
のためにstring_a
; "st string"
のためにstring_b
そして""
のためにstring_c
;(.*?)
は、残っているものを捕まえようとします。これは、この正規表現が欲張りではないためにのみ機能?
します(そうでない場合は、文字列の残りの部分を取得し、最後のグループに何も残しません。例:"y long long lo"
for string_a
、"e"
for string_b
、および""
forstring_c
中央のグループが3文字より大きいかどうかを確認するよりも、大きい場合は。に置き換え"..."
ます。これはでのみ発生しstring_a
ます。ここでは、長くしたくないので、結果を.string_b
に置き換えます。"e"
"..."
"A simple t...st string"
最後に、グループ(配列要素)を1つの文字列に結合します。Array.join
これでうまくいきます:
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
..
str = "abcdefghijklmnopqrstuvwxyz"
str[9..-10] = "..."
p str #=> "abcdefghi...rstuvwxyz"
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