ruby中對字串的操作
建立字串
在Ruby中建立一個字串有多種方式。可以有兩種方式表示一個字串:用一對單引號包圍字元('str')或用一對雙引號包圍字元("str") 這兩種形式的區別在於對於包圍的字串的處理,用雙引號構造的字串能處理更多的轉移字元。
除了這兩種方式,ruby還支援3種方式去構建字串:%q、%Q和here documents。
%q後面用一對分界符包圍的字元可以構造單引號字串。
%Q後面用一對分界符包圍的字元可以構造雙引號字串。
PS:分界符可以是任何一個非字母數字的單位元組字元,如() [] {} <> //。
here documents
str=<<END_OF_STRING
a string
END_OF_STRING
ruby中並不會去掉字串開頭的空格。
#5種構建字串hello world的方法對比
'hello world'
"hello world"
%q/hello world/
%Q{hello world}
str=<<EOS
hello world
EOS
單引號和雙引號在某些情況下有不同的作用.一個由雙引號括起來的字串允許字元由一個前置的斜槓引出,而且可以用#{}內嵌表示式.而 單引號括起來的字串並不會對字串作任何解釋
Ruby的字串操作比C更靈巧,更直觀.比如說,你可以用+把幾個串連起來,用*把一個串重複好幾遍:
"foo" + "bar" #"foobar"
"foo" * 2 # #"foofoo"
抽取字元(注意:在Ruby裡,字元被視為整數):
負的索引指從字串尾算起的偏移量,
word[0]
word[-1]
herb[0,1]
herb[-2,2]
herb[0..3]
herb[-5..-2]
檢查相等:
"foo" == "foo"
字串基本操作
ruby中常用的簡單字串處理函式
split()
trim()
indexOf()
replaceAll()
String.split
"hello world".split( " ")
returns [ "hello", "world" ].
String.strip
" hello world ".strip
returns "hello world".
String.index
"hello world".index( "w")
returns 6.
String.gsub(/\s/, ',')
"hello word".gsub(\/s\, ',')
returns "hello,word"
p.s.
sub() replace first
gsub() replace all
1、字串定義與產生
str1 = 'Hello world'
str2 = "Hello world" #雙引號比單引號定義的字串更加強大,如可提供轉移字元等
str3 = %q/Hello world/ # %q將後面的字串轉換成單引號字串,後面的/為自定義的特殊符號,在字串結尾處也需有該特殊符號
str4 = %Q/Hello world/ # %Q將定義雙引號字串
str = <<The_Text Hello World! Hello Ruby. The_Text
puts str #這種方式比較有意思,str的內容為<<The_Text到下個The_Text之間的內容,The_Text為自定義的文字
arr = [1,1,1,2,2]
puts arr.join(",") #陣列用join轉換成字串
2、字串操作
str = 'this' + " is"
str += ' you'
str <<" string"<<"."
puts str * 2 #this is you string.this is you string.
puts str[-12,12] # you string. 意味從後擷取多少個字元
3、轉義字串
\n \t \'
字串轉移只對雙引號字串生效,例外為單引號,如:
str = 'this\'s you string.'
字串內嵌入表示式用 #{ }
def Hello(name)
"Hello #{neme}!"
end
4、刪除
str.delete(str1,str2,...)
#刪除引數交集出現的所有字元,返回一個新字串,如:
"hello world".delete("l") #返回"heo word"
"hello world".delete("lo","o") #返回"hell wrld"str.delete!(str1,str2,...)
#直接對str進行刪除操作,同時返回str如:
str="hello world"
str2=str.delete("l") #str為"hello world",str2為"heo word"
str.delete!("l") #str為"heo word"
5.字串替換
str.gsub(pattern, replacement) => new_str
str.gsub(pattern) {|match| block } => new_str
"hello".gsub(/[aeiou]/, '*') #=> "h*ll*" #將母音替換成*號
"hello".gsub(/([aeiou])/, '<\1>') #=> "h<e>ll<o>" #將母音加上尖括號,\1表示保留原有字元???
"hello".gsub(/./) {|s| s[0].to_s + ' '}#=> "104 101 108 108 111 "
字串替換二:
str.replace(other_str) => str
s = "hello" #=> "hello"
s.replace "world" #=> "world"
6.字串刪除:
str.delete([other_str]+) => new_str
"hello".delete "l","lo" #=> "heo"
"hello".delete "lo" #=> "he"
"hello".delete "aeiou", "^e" #=> "hell"
"hello".delete "ej-m" #=> "ho"
7.去掉前和後的空格
str.lstrip => new_str
" hello ".lstrip #=> "hello "
"hello".lstrip #=> "hello"
8.字串匹配
str.match(pattern) => matchdata or nil
9.字串反轉
str.reverse => new_str
"stressed".reverse #=> "desserts"
10.去掉重複的字元
str.squeeze([other_str]*) => new_str
"yellow moon".squeeze #=> "yelow mon" #預設去掉串中所有重複的字元
" now is the".squeeze(" ") #=> " now is the" #去掉串中重複的空格
"putters shoot balls".squeeze("m-z") #=> "puters shot balls" #去掉指定範圍內的重複字元
11.轉化成數字
str.to_i=> str
"12345".to_i #=> 12345
12、chomp和chop的區別:
chomp:去掉字串末尾的\n或\r
chop:去掉字串末尾的最後一個字元,不管是\n\r還是普通字元
"hello".chomp #=> "hello"
"hello\n".chomp #=> "hello"
"hello\r\n".chomp #=> "hello"
"hello\n\r".chomp #=> "hello\n"
"hello\r".chomp #=> "hello"
"hello".chomp("llo") #=> "he"
"string\r\n".chop #=> "string"
"string\n\r".chop #=> "string\n"
"string\n".chop #=> "string"
"string".chop #=> "strin"
13、長度
#求字串長度,返回int
str.size
str.length
14、特殊字元處理
str.chop
#刪除字串str的最後一個字元,並返回新字串
#若字串以\r\n結尾,則兩個字元都刪去
#若字串為空串,則返回空串
"string\r\n".chop #返回"string"
"string\n\r".chop #返回"string\n"
"string".chop #返回"strin"
"s".chop.chop #返回""str.chop!
--------------------------------------------------------------------------------
str.chomp(endstr)
#刪除str的字尾endstr
#如果未指定endstr,則刪除回車換行符(\r、\n和\r\n)
"hello\r\n".chomp #返回"hello"
"hello".chomp("lo")#返回"hel"
"hello".chomp("l") #返回"hello"str.chomp!
15、Ruby字串處理函式包括返回字串長度函式;
"hello".include? "lo"
16、Ruby生成隨機數和隨機字串
rand(100000)
def newpass( len )
chars = ("a".."z").to_a + ("A".."Z").to_a + ("0".."9").to_a
newpass = ""
1.upto(len) { |i| newpass << chars[rand(chars.size-1)] }
return newpass
end
Ruby字串處理函式
1.返回字串的長度
str.length => integer
2.判斷字串中是否包含另一個串
str.include? other_str #true or false
"hello".include? "lo"#=> true
"hello".include? "ol"#=> false
"hello".include? ?h#=> true
3.字串插入:
str.insert(index, other_str) #str
"abcd".insert(0, 'X') #=> "Xabcd"
"abcd".insert(3, 'X') #=> "abcXd"
"abcd".insert(4, 'X') #=> "abcdX"
"abcd".insert(-3, 'X') #=> "abXcd"
"abcd".insert(-1, 'X') #=> "abcdX"
4.字串分隔,預設分隔符為空格
str.split(pattern=$;, [limit])# anArray
" now's the time".split #=> ["now's", "the", "time"]
"1, 2.34,56, 7".split(%r{,\s*}) #=> ["1", "2.34", "56", "7"]
"hello".split(//) #=> ["h", "e", "l", "l", "o"]
"hello".split(//, 3) #=> ["h", "e", "llo"]
"hi mom".split(%r{\s*}) #=> ["h", "i", "m", "o", "m"]
"mellow yellow".split("ello") #=> ["m", "w y", "w"]
"1,2,,3,4,,".split(',') #=> ["1", "2", "", "3", "4"]
"1,2,,3,4,,".split(',', 4) #=> ["1", "2", "", "3,4,,"]
也可以指定切分符:
"apples, pears, and peaches".split(", ") # ["apples", "pears", "and peaches"]
"lions and tigers and bears".split(/ and /) # ["lions", "tigers", "bears"]
splite方法的第二個引數用來限制切分的返回結果個數,具體效果規則如下:
1.如果省略這個引數,則切分結果中末尾為null的結果將被壓縮掉
2.如果是正數,則結果按照指定的限制數量進行切分,尾部的null結果也將會保留做為結果
3.如果是負數,則切分結果數量無限制,並且保留尾部的null結果。
例如:
str = "alpha,beta,gamma,,"
list1 = str.split(",") # ["alpha","beta","gamma"]
list2 = str.split(",",2) # ["alpha", "beta,gamma,,"]
list3 = str.split(",",4) # ["alpha", "beta", "gamma", ","]
list4 = str.split(",",8) # ["alpha", "beta", "gamma", "", ""]
list5 = str.split(",",-1) # ["alpha", "beta", "gamma", "", ""]
5、格式化字串
======================================================================
Ruby的字串格式話沿用了C的格式,在C中可用於sprintf或printf的格式話字元在Ruby中同樣適用:
name = "Bob"
age = 28
str = sprintf("Hi, %s... I see you're %d years old.", name, age)
String類有個%方法,可以方面的做格式化的工作,它接受任何型別的單個值或一個數組:
str = "%-20s %3d" % [name,age]
上面這個和下面這個式子是等效的
str = sprintf("%-20s %3d", name, age)
我們還可以使用ljust,rjust,center方法來格式化我們的字串:
str = "Moby-Dick"
s1 = str.ljust(13) #"Moby-Dick "
s2 = str.center(13) #" Moby-Dick "
s3 = str.rjust(13) #" Moby-Dick"
6、控制字串的大小寫
==========================================
Ruby的String類提供了一組豐富的方法來控制大小寫:
s = "Hello,World"
s1 = s.downcase #"hello,world"
s2 = s.upcase #"HELLO,WORLD"
capitalize方法把字串第一個字元變大寫,其餘都是小寫:
s3 = s.capitalize #"Hello,world"
swapcase則是把字串中的每個字元的大小寫轉換一下(原來大寫的都小寫,反之亦然):
s = "HELLO,world"
s1 = s.swapcase #"hello,WORLD"
這些方法都有相應的in-place方法
(upcase!,downcase!,capitalize!,swapcase!)
雖然,Ruby沒有提供內建的判斷字元是否是大小寫的方法,但是,這不是問題,我們可以通過正則表示式來完成這一點:
if string =~ /[a-z]/
puts "string contains lowercase charcters"
end
if string =~ /[A-Z]/
puts "string contains uppercase charcters"
end
if string =~ /[A-Z]/ and string =~ /a-z/
puts "string contains mixed case"
end
if string[0..0] =~ /[A-Z]/
puts "string starts with a capital letter"
end
字串的子串
=============================================
Ruby提供了多種訪問操作字串子串的方式,我們可以來看一下:
1.如果給出一組數字,則第一個數字代表取字串的偏移位置,第二個數字表示
取的長度:
str = "Humpty Dumpty"
sub1 = str[7,4] # "Dump"
sub2 = str[7,99] # "Dumpty" (超過的長度按實際長度來取)
sub3 = str[10,-4] # nil (長度為負數了)
記住,上面的形式,很多從別的語言轉過來的ruby初學者會認為給出的兩個數字是子串的開始和結束位置的偏移,這是錯誤的,務必記住。
給出的偏移是負數也是可以的,這樣,位置將從字串末尾開始計算:
str1 = "Alice"
sub1 = str1[-3,3] # "ice"
str2 = "Through the Looking-Glass"
sub3 = str2[-13,4] # "Look"
我們也可以給出一個Range來取子串:
str = "Winston Churchill"
sub1 = str[8..13] # "Church"
sub2 = str[-4..-1] # "hill"
sub3 = str[-1..-4] # nil
sub4 = str[25..30] # nil
強大的是,正則表示式在這個時候也充分發揮著作用:
str = "Alistair Cooke"
sub1 = str[/l..t/] # "list"
sub2 = str[/s.*r/] # "stair"
sub3 = str[/foo/] # nil
如果給出的是一個字串,則如果目標字串中含有這個給出的字串,則返回這個給出的字串,否則返回nil:
str = "theater"
sub1 = str["heat"] # "heat"
sub2 = str["eat"] # "eat"
sub3 = str["ate"] # "ate"
sub4 = str["beat"] # nil
sub5 = str["cheat"] # nil
如果給出的是一個數字,則返回的是該數字對應索引處字元的ASCII碼:
str = "Aaron Burr"
ch1 = str[0] # 65
ch1 = str[1] # 97
ch3 = str[99] # nil
同樣,我們不僅可以通過上面的方式訪問子串,還可以來向字串設定內容:
str1 = "Humpty Dumpty"
str1[7,4] = "Moriar" # "Humpty Moriarty"
str2 = "Alice"
str2[-3,3] = "exandra" # "Alexandra"
str3 = "Through the Looking-Glass"
str3[-13,13] = "Mirror" # "Through the Mirror"
str4 = "Winston Churchill"
str4[8..13] = "H" # "Winston Hill"
str5 = "Alistair Cooke"
str5[/e$/] ="ie Monster" # "Alistair Cookie Monster"
str6 = "theater"
str6["er"] = "re" # "theatre"
str7 = "Aaron Burr"
str7[0] = 66 # "Baron Burr"
重定義字串的比較
=================================
字串的比較<,<=,>,>=其實是四個方法,他們都會呼叫<=>這個方法,我們可以重新定義<=>來改變比較的行為:
class String
alias old_compare <=>
def <=>(other)
a = self.dup
b = other.dup
a.gsub!(/[\,\.\?\!\:\;]/, "")
b.gsub!(/[\,\.\?\!\:\;]/, "")
a.gsub!(/^(a |an |the )/i, "")
b.gsub!(/^(a |an |the )/i, "")
a.strip!
b.strip!
a.old_compare(b)
end
end
title1 = "Calling All Cars"
title2 = "The Call of the Wild"
# 未重定義之前,以下結果會是yes,但現在,將變成no
if title1 < title2
puts "yes"
else
puts "no"
end
但是,==不會呼叫<=>,因此,如果我們要定義特殊的“比較是否相等”,則我們需要覆蓋==這個方法。