Como obter uma substring de texto?


172

Eu tenho texto com comprimento ~ 700. Como obtenho apenas ~ 30 de seus primeiros caracteres?

Respostas:



207

Use String#slice, também conhecido como [].

a = "hello there"
a[1]                   #=> "e"
a[1,3]                 #=> "ell"
a[1..3]                #=> "ell"
a[6..-1]               #=> "there"
a[-3,2]                #=> "er"
a[-4..-2]              #=> "her"
a[12..-1]              #=> nil
a[-2..-4]              #=> ""
a[/[aeiou](.)\1/]      #=> "ell"
a[/[aeiou](.)\1/, 0]   #=> "ell"
a[/[aeiou](.)\1/, 1]   #=> "l"
a[/[aeiou](.)\1/, 2]   #=> nil
a["lo"]                #=> "lo"
a["bye"]               #=> nil

31
Para ser claro, -1é usado para chegar ao final da string, então a[1..-1] #=> "ello there".
Joshua Pinter

5
Isso pode ser óbvio para alguns, mas é não problema em usar uma vírgula para posições negativas: a[-4,-2]. A notação só é válida se os dois pontos: a[-4..-2]. Aprendi da maneira mais difícil.
cavpollo

24

Desde que você o marcou como Rails, você pode usar truncar:

http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-truncate

Exemplo:

 truncate(@text, :length => 17)

Também é bom saber que trechos permitem exibir um trecho de um texto.

 excerpt('This is an example', 'an', :radius => 5)
 # => ...s is an exam...

http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-excerpt


9
Ruby não é Rails.
Joó Ádám

A tag @ JoóÁdám foi alterada por Andrew Marshall
apneadiving 14/11

Havia alguma justificativa para a mudança? Se o OP funcionar no Rails e solicitar uma solução no Rails, a pergunta deverá ser marcada com o Rails. E então sua resposta faria sentido.
Joó Ádám

@ JoóÁdám a pergunta foi marcada como Rails pelo OP, esse é o ponto
apneadiving

Entendi, não vejo por que a tag foi removida. Eu editei a pergunta e deixei claro que é sobre o Rails. Está pendente de revisão.
Joó Ádám

12

se você precisar dele em trilhos, você pode usar primeiro ( código fonte )

'1234567890'.first(5) # => "12345"

também existe o último ( código fonte )

'1234567890'.last(2) # => "90"

alternativamente, verifique de / para ( código fonte ):

"hello".from(1).to(-2) # => "ell"

NoMethodError: undefined method `first' for "abcde":String, é uma implementação de trilhos?
Tiw

Sim, ele é. mas você também pode copiar fonte ligações forma de código que eu postei
Aray Karjauv

0

Se você deseja uma sequência, as outras respostas são boas, mas se o que você procura são as primeiras letras como caracteres, você pode acessá-las como uma lista:

your_text.chars.take(30)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.