Sök…


Syntax

  • 'En sträng' // skapar en sträng via en citerad bokstav
  • "En sträng" // skapar en sträng via dubbelciterade bokstäver
  • String.new ("En sträng")
  • % q (A sträng) // alternativ syntax för att skapa enstaka citerade strängar
  • % Q (A-sträng) // alternativ syntax för att skapa dubbla citerade strängar

Skillnad mellan enda citerade och dubbelciterade strängbokstäver

Huvudskillnaden är att dubbelciterade String bokstäver stödjer stränginterpolationer och hela uppsättningen av flukt-sekvenser.

Till exempel kan de inkludera godtyckliga Ruby-uttryck via interpolering:

# Single-quoted strings don't support interpolation
puts 'Now is #{Time.now}'
# Now is #{Time.now}

# Double-quoted strings support interpolation
puts "Now is #{Time.now}"
# Now is 2016-07-21 12:43:04 +0200

Dubbelciterade strängar stöder också hela uppsättningen av flukt-sekvenser inklusive "\n" , "\t" ...

puts 'Hello\nWorld'
# Hello\nWorld

puts "Hello\nWorld"
# Hello
# World

... medan enstaka citerade strängar stöder inga flyktningssekvenser, och utesluter den minimala uppsättning som krävs för att enstaka citerade strängar ska vara användbara: Bokstavliga enkla citationstecken och backstryk, '\'' respektive '\\' .

Skapa en sträng

Ruby tillhandahåller flera sätt att skapa ett String objekt. Det vanligaste sättet är att använda enstaka eller dubbla citat för att skapa en " strängbokstav ":

s1 = 'Hello'
s2 = "Hello"

Huvudskillnaden är att dubbelciterade strängbokstäver är lite mer flexibla eftersom de stöder interpolering och vissa motströmssekvenser.

Det finns också flera andra möjliga sätt att skapa en strängbokstavlig med hjälp av godtyckliga strängavgränsare. En godtycklig strängavgränsare är en % följt av ett matchande par avgränsare:

%(A string)
%{A string}
%<A string>
%|A string|
%!A string!

Slutligen kan du använda sekvensen %q och %Q , som motsvarar ' och " ":

puts %q(A string)
# A string
puts %q(Now is #{Time.now})
# Now is #{Time.now}

puts %Q(A string)
# A string
puts %Q(Now is #{Time.now})
# Now is 2016-07-21 12:47:45 +0200

Sekvenserna %q och %Q är användbara när strängen innehåller antingen enstaka citat, dubbla citat eller en blandning av båda. På detta sätt behöver du inte undvika innehållet:

%Q(<a href="/profile">User's profile<a>)

Du kan använda flera olika avgränsare, så länge det finns ett matchande par:

%q(A string)
%q{A string}
%q<A string>
%q|A string|
%q!A string!

Strängen sammankoppling

Sammanfoga strängar med + -operatören:

s1 = "Hello"
s2 = " "
s3 = "World"

puts s1 + s2 + s3
# => Hello World

s = s1 + s2 + s3
puts s
# => Hello World

Eller med << operatören:

s = 'Hello'
s << ' '
s << 'World'
puts s
# => Hello World

Observera att << -operatören modifierar objektet på vänster sida.

Du kan också multiplicera strängar, t.ex.

"wow" * 3
# => "wowwowwow"

Stränginterpolering

Den dubbelciterade avgränsaren " och %Q sekvensen stöder stränginterpolering med #{ruby_expression} :

puts "Now is #{Time.now}"
# Now is Now is 2016-07-21 12:47:45 +0200

puts %Q(Now is #{Time.now})
# Now is Now is 2016-07-21 12:47:45 +0200

Fall manipulation

"string".upcase     # => "STRING"
"STRING".downcase   # => "string"
"String".swapcase   # => "sTRING"
"string".capitalize # => "String"

Dessa fyra metoder modifierar inte den ursprungliga mottagaren. Till exempel,

str = "Hello"
str.upcase # => "HELLO"
puts str   # => "Hello"

Det finns fyra liknande metoder som utför samma åtgärder men ändrar originalmottagaren.

"string".upcase!     # => "STRING"
"STRING".downcase!   # => "string"
"String".swapcase!   # => "sTRING"
"string".capitalize! # => "String"

Till exempel,

str = "Hello"
str.upcase!  # => "HELLO"
puts str     # => "HELLO"

Anmärkningar:

  • före Ruby 2.4 hanterar dessa metoder inte unicode.

Dela en sträng

String#split delar en String i en Array , baserad på en avgränsare.

"alpha,beta".split(",")
# => ["alpha", "beta"]

En tom String resulterar i en tom Array :

"".split(",")
# => []

En icke-matchande avgränsare resulterar i en Array innehåller ett enda objekt:

"alpha,beta".split(".")
# => ["alpha,beta"]

Du kan också dela en sträng med vanliga uttryck:

"alpha, beta,gamma".split(/, ?/)
# => ["alpha", "beta", "gamma"]

Avgränsaren är valfri, som standard delas en sträng ut på vitutrymmet:

"alpha beta".split
# => ["alpha", "beta"] 

Gå med strängar

Array#join förenar en Array in a String , baserat på en avgränsare:

["alpha", "beta"].join(",")
# => "alpha,beta"

Avgränsaren är valfri och är standard som en tom String .

["alpha", "beta"].join
# => "alphabeta"

En tom Array resulterar i en tom String , oavsett vilken avgränsare som används.

[].join(",")
# => ""

Multiline strängar

Det enklaste sättet att skapa en multiline-sträng är att bara använda flera rader mellan citattecken:

address = "Four score and seven years ago our fathers brought forth on this
continent, a new nation, conceived in Liberty, and dedicated to the
proposition that all men are created equal."

Det huvudsakliga problemet med den tekniken är att om strängen innehåller en offert, kommer den att bryta strängsyntaxen. För att lösa problemet kan du istället använda en heredok :

puts <<-RAVEN
  Once upon a midnight dreary, while I pondered, weak and weary, 
  Over many a quaint and curious volume of forgotten lore— 
      While I nodded, nearly napping, suddenly there came a tapping, 
  As of some one gently rapping, rapping at my chamber door. 
  "'Tis some visitor," I muttered, "tapping at my chamber door— 
              Only this and nothing more." 
  RAVEN

Ruby stöder skal-stil här dokument med <<EOT , men den avslutande texten måste starta raden. Det skruvar upp kodindragningen, så det finns inte mycket skäl att använda den stilen. Tyvärr har strängen indragningar beroende på hur själva koden är indragad.

Ruby 2.3 löser problemet genom att införa <<~ som avlägsnar överskott av ledande utrymmen:

2,3
def build_email(address)
  return (<<~EMAIL)
    TO: #{address}

    To Whom It May Concern:

    Please stop playing the bagpipes at sunrise!
                     
    Regards,
    Your neighbor               
  EMAIL
end

Procentsträngar arbetar också för att skapa flerlinje strängar:

%q(
HAMLET        Do you see yonder cloud that's almost in shape of a camel?
POLONIUS        By the mass, and 'tis like a camel, indeed.
HAMLET        Methinks it is like a weasel.
POLONIUS        It is backed like a weasel.
HAMLET        Or like a whale?
POLONIUS        Very like a whale
)

Det finns några sätt att undvika interpolering och flykt-sekvenser:

  • Enstaka offert istället för dubbla offert: '\n is a carriage return.'

  • Mindre bokstäver q i en procentsträng: %q[#{not-a-variable}]

  • Enkel citat terminalsträngen i en heredoc:

    <<-'CODE'
       puts 'Hello world!'
    CODE
    

Formaterade strängar

Ruby kan injicera en mängd värden i en sträng genom att ersätta alla platshållare med värdena från den medföljande matrisen.

"Hello %s, my name is %s!" % ['World', 'br3nt']
# => Hello World, my name is br3nt!

Platshållarna representeras av två %s och värdena tillhandahålls av matrisen ['Hello', 'br3nt'] . Operatören % instruerar strängen att injicera matrisvärdena.

Stringkaraktersättare

tr metoden returnerar en kopia av en sträng där tecknen i det första argumentet ersätts av tecknen i det andra argumentet.

"string".tr('r', 'l') # => "stling"

För att ersätta endast den första förekomsten av ett mönster med med ett annat uttryck använda sub metoden

"string ring".sub('r', 'l') # => "stling ring"

Om du vill ersätta alla förekomster av ett mönster med det uttrycket, använd gsub

"string ring".gsub('r','l') # => "stling ling" 

För att radera tecken, mata in en tom sträng för den andra parametern

Du kan också använda reguljära uttryck i alla dessa metoder.

Det är viktigt att notera att dessa metoder bara returnerar en ny kopia av en sträng och inte kommer att ändra strängen på plats. För att göra det måste du använda tr! , sub! och gsub! metoder respektive.

Förstå data i en sträng

I Ruby är en sträng bara en sekvens av byte tillsammans med namnet på en kodning (som UTF-8 , US-ASCII , ASCII-8BIT ) som anger hur du kan tolka dessa byte som tecken.

Rubinsträngar kan användas för att hålla text (i princip en sekvens av tecken), i vilket fall UTF-8-kodningen vanligtvis används.

"abc".bytes  # => [97, 98, 99]
"abc".encoding.name  # => "UTF-8"

Rubinsträngar kan också användas för att hålla binära data (en sekvens av byte), i vilket fall ASCII-8BIT-kodningen vanligtvis används.

[42].pack("i").encoding  # => "ASCII-8BIT"

Det är möjligt för sekvensen av byte i en sträng att inte matcha kodningen, vilket resulterar i fel om du försöker använda strängen.

"\xFF \xFF".valid_encoding? # => false
"\xFF \xFF".split(' ')      # ArgumentError: invalid byte sequence in UTF-8

Stringsubstitution

p "This is %s" % "foo"
# => "This is foo"

p "%s %s %s" % ["foo", "bar", "baz"]
# => "foo bar baz"

p "%{foo} == %{foo}" % {:foo => "foo" }
# => "foo == foo"

Se String % docs och Kernel :: sprintf för mer information.

Strängen börjar med

För att hitta om en sträng börjar med ett mönster, start_with? metoden är praktiskt

str = "zebras are cool"
str.start_with?("zebras")      => true

Du kan också kontrollera mönstret med index

str = "zebras are cool"
str.index("zebras").zero?      => true

Strängen slutar med

För att hitta om en sträng slutar med ett mönster, end_with? metoden är praktiskt

str = "I like pineapples"
str.end_with?("pineaaples")      => false

Positioneringssträngar

I Ruby kan strängar vara vänster-rättfärdiga, höger-rättfärdiga eller centrerade

För att vänstertillföra sträng använder du ljust metoden. Detta tar in två parametrar, ett heltal som representerar antalet tecken i den nya strängen och en sträng, som representerar mönstret som ska fyllas.

Om heltalet är större än längden på den ursprungliga strängen kommer den nya strängen att vara rättfärdigad med den valfria strängparametern som tar återstående utrymme. Om strängparametern inte ges, kommer strängen vadderas med mellanslag.

str ="abcd"
str.ljust(4)          => "abcd"
str.ljust(10)         => "abcd      "

För att rättfärdiggöra en sträng använder du rjust metoden. Detta tar in två parametrar, ett heltal som representerar antalet tecken i den nya strängen och en sträng, som representerar mönstret som ska fyllas.

Om heltalet är större än längden på den ursprungliga strängen, kommer den nya strängen att rättfärdigas med den valfria strängparametern som tar återstående utrymme. Om strängparametern inte ges, kommer strängen vadderas med mellanslag.

str = "abcd"
str.rjust(4)          => "abcd"
str.rjust(10)         => "      abcd"

För att centrera en sträng använder center metoden. Detta tar in två parametrar, ett heltal som representerar bredden på den nya strängen och en sträng, som den ursprungliga strängen är vadderad med. Strängen justeras mot mitten.

str = "abcd"
str.center(4)          => "abcd"
str.center(10)         => "   abcd   "


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow